Jak provedu příkaz, kde je nalezen soubor?
Předpokládejme, že mám adresář s názvem testdir
který obsahuje následující:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf
Nyní chci provést akci (provést příkaz), kde find
najde určitý soubor/typ souboru. Například mi dovolte najít *.pdf
:
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Nyní předpokládejme, že chci provést příkaz (například řeknu touch file
), kde výše uvedený příkaz najde soubor(y). Jinými slovy, chci vytvořit soubor s názvem file
v každém adresáři je alespoň jeden .pdf
byl nalezen, takže dostávám:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf file
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf file
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf file
Jak takovou práci provedu?
Může být pro každý nalezený soubor cd
tam, kde soubor existuje, a provést příkaz rekurzivně.
Vím, že find
má úžasnou funkci:-exec
ale nemůžu to zprovoznit.
Toto je pouze příklad pro získání představy o tom, co chci dělat. Obecně:Jak provést příkaz, kde jsou nalezeny soubory (pomocí find
) rekurzivně?
Přijatá odpověď:
Pokud spustíte tento příkaz, váš touch file
bude spuštěn, potenciálně vícekrát, z adresáře, ve kterém byl příkaz spuštěn:
find -name '*.pdf' -exec touch file ;
Na druhou stranu, pokud spustíte tuto variantu, každá instance příkazu bude spuštěna v adresáři cílového souboru:
find -name '*.pdf' -execdir touch file ;
V obou případech to můžete vidět v akci nahrazením touch file
buď s echo {}
a/nebo pwd
.
Z manuálové stránky:
-execdir command ;
-execdir command {} +
Jako
-exec
, ale zadaný příkaz je spuštěn z podadresáře obsahujícího odpovídající soubor, což obvykle není adresář, ve kterém jste začalifind
.