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 ):

  1. Pokud glob, který neodpovídá, není rozšířen shellem, find bude (omylem, nevadí) projevovat správné chování.
  2. 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

  • Symlinks byly také můj problém. -follow je čitelnějším synonymem pro -L, pokud ho dáte před ostatní parametry.
  • Skvělé ! Díky moc!! +1!

Odpověď

Uniknout z *

find . -name \*.java 

Napsat komentář

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