Mám jednoduchý skript, kterému většinou rozumím, je to příkaz „find“, který je nejasný. „Mám spoustu dokumentace, ale neslouží k tomu, aby to bylo mnohem jasnější. Moje myšlenka je, že funguje jako smyčka for, aktuálně nalezený soubor je zaměněn za {} a zkopírován do $ HOME / $ dir_name, ale jak funguje vyhledávání pomocí -path a -prune -o pracovat? Je nepříjemné mít takovou konkrétní a relevantní dokumentaci a stále nevím, o co jde.

#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0 

Toto je jen dokumentace, o které vím, že bych ji měl být schopni na to přijít.

-path pattern

Název souboru odpovídá vzoru shellu. Metaznaky nezacházejí zvlášť s / nebo . ; například najít. -path „./sr*sc“ vytiskne položku pro adresář s názvem ./src/misc (pokud existuje). Chcete-li ignorovat celý strom adresářů, použijte -prune místo kontroly všech souborů ve stromu. Chcete-li například přeskočit adresář src / emacs a všechny soubory a adresáře pod ním a vytisknout názvy dalších nalezených souborů, postupujte takto:

find . -path ./src/emacs -prune -o -print

Z příručky Findutils

– Akce: příkaz -exec; Tuto nezabezpečenou variantu akce -execdir určuje POSIX. Hlavní rozdíl spočívá v tom, že příkaz je spuštěn v adresáři, ze kterého bylo vyvoláno find , což znamená, že {} je rozšířen na relativní cestu začínající názvem jednoho z spouštění adresářů, nikoli pouze název basen shodného souboru.

Zatímco některé implementace funkce find nahraďte {} pouze tam, kde se objeví samostatně v argumentu GNU find nahradí {} kdekoli se objeví.

And

Chcete-li například porovnat každý soubor záhlaví C v aktuálním adresáři nebo pod ním se souborem / tmp / master:

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

Komentáře

  • Možný duplikát find: prune neignoruje zadanou cestu
  • Myslím, že pokud vůbec, ‚ je duplikát find-path vysvětleno i když odpověď na find: prune neignoruje zadané p ath má odpověď, která, jak se zdá, na tuto otázku platí. Možná mají odpovědi find-path explains smysl pro někoho, kdo má zkušenosti se skriptováním, ale ‚ mi nepomůže. Odpovědi, které zde předkládám, mi zatím dávají větší smysl, i když jsem je ‚ právě začal zkoumat.

Odpověď

-path funguje přesně jako -name, ale použije vzor na celá cesta k zkoumanému souboru, nikoli k poslední komponentě.

-prune zakazuje sestupovat pod nalezený soubor, pokud by šlo o adresář.

Když to všechno spojíme, příkaz

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Začíná hledat soubory v $HOME.
  2. Pokud najde soubor odpovídající $HOME/$dir_name, pod něj se nedostane („podřezává“ podadresář).
  3. Jinak (-o), pokud najde soubor odpovídající *$file_suffix zkopíruje jej do $HOME/$dir_name/.

Myšlenkou se zdá být vytvoření zálohy části obsahu $HOME v subdirec tory of $HOME. Části s -prune jsou samozřejmě nezbytné, aby se zabránilo zálohování záloh …

Komentáře

  • Pokud tomu rozumím, pak: find bude iterovat skrz každý adresář v $ HOME, do kterého má oprávnění jít, kromě $ HOME / $ dir_name, do kterého nebude sestupovat (protože akce prořezávání bude vyhodnocena jako true a nebo nebudou brány), hledání souborů, které končí $ file_suffix. Jakmile jeden najde, provede cp “ found_file.sh “ do $ HOME / $ dir_name? -Path také umožňuje cestu k souboru a je užitečné, když chcete najít sestup do adresářů a ne jen pracovat v aktuálním adresáři?
  • Vaše porozumění je téměř opravit. -path funguje stejně jako -name: vybírá soubory. Rozdíl je v tom, že -name odpovídá vzoru názvu souboru, zatímco -path odpovídá vzoru celé cestě. find vždy sestupuje do podadresářů, pokud tomu nebrání -maxdepth nebo -prune atd.
  • Ach!-path se aplikuje na $ HOME / $ dir_name -prune, pak je ‚ v pořadí příkazů, které mě zkazily, a -path je pro příkaz prune nezbytný, protože musí odpovídat celé cestě prořezaného adresáře.
  • @Darren I ‚ si nejsem jistý, jestli ‚ je docela přesný. -path $HOME/$dir_name je jedna akce. Jedná se o test, který kontroluje, zda se cesta k aktuálnímu zkoumanému souboru shoduje s čímkoli $HOME/$dir_name. -prune je samostatná akce. Myslím, že první věta vašeho prvního komentáře přesně odráží, jak to funguje.
  • Chybělo by něco, aby to bylo vidět jako roura? Vyměnil jsem -prune s -print a myslím, že tok je nyní jasný: najít $ HOME | -cesta $ HOME / $ dir_name | -print

Odpověď

Je součástí příkazu find, příkazu -exec.

Umožňuje interakci se souborem / adresářem nalezeným příkazem find.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME znamená vyhledání souborů / adresářů v $ HOME

Chcete-li porozumět -path <some_path>, podívejte se `find -path` vysvětleno

Chcete-li porozumět -prune, podívejte se na https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o znamená NEBO, takže -path <some_path> NEBO -name *$file_suffix

-exec znamená provést příkaz.

cp {} $HOME/$dir_name/ zkopírovat všechny soubory odpovídající $HOME/$dir_name/

\; znamená ukončete příkaz -exec

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *