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
– 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/ \;
- Začíná hledat soubory v
$HOME
. - Pokud najde soubor odpovídající
$HOME/$dir_name
, pod něj se nedostane („podřezává“ podadresář). - 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