Spouštím následující příkaz, ale neprovádí se rekurzivně:
find . -name *.java
Vím, že v aktuálním adresáři jsou java soubory dále, ale provádí find
pouze v aktuálním adresáři. Používám OS X, 10.9.
Odpověď
Problém je v tom, že jste necitovali své -name
parametr. Místo toho:
find . -name "*.java"
Vysvětlení
Bez uvozovek shell interpretuje *.java
jako vzor glob a před jeho předáním jej rozšíří na všechny názvy souborů odpovídajících glob. to find
. Tímto způsobem, pokud jste měli, řekněme foo.java
v aktuálním adresáři, find
by byl:
find . -name foo.java
který by zjevně vypsal pouze soubor v aktuálním adresáři (pokud náhodou nemáte nějaký podobně pojmenovaný soubory dále ve stromu).
Citace zabrání rozšíření glob a předá příkazový řádek find
tak, jak je.
Mimochodem, pokud glob se nepodařilo najít (žádné *.java
soubory v aktuálním směru tory), získáte jedno ze dvou chování v závislosti na tom, jak je váš shell nastaven na zpracování globů, které se neshodují (to se řídí například volbou nullglob
v Bashi ):
- Pokud glob, který neodpovídá, není rozšířen shellem,
find
bude (omylem, nevadí) projevovat správné chování. - Pokud se glob, který neodpovídá, rozbalí shell do prázdného řetězce,
find
si bude stěžovat, že mu chybí argument-name
.
Odpověď
Měla jsem podobnou situaci, když jsem obklopovala -name hodnota v uvozovkách, ale stále jsem nedostal všechny nálezy, v které jsem doufal. Domníval jsem se, že to bylo kvůli symbolickým odkazům a jistě to tak bylo. Chcete-li vynutit vyhledání pomocí symbolických odkazů, můžete příkaz upravit takto:
find -L . -name "*.java"
Komentáře
Odpověď
Uniknout z *
find . -name \*.java
-follow
je čitelnějším synonymem pro-L
, pokud ho dáte před ostatní parametry.