Jag kör följande kommando, men det utförs inte rekursivt:
find . -name *.java
Jag vet att det finns java-filer längre ner i den aktuella katalogen men den utför endast find
i den aktuella katalogen. Jag använder OS X, 10.9.
Svar
Problemet är att du inte citerade din -name
-parameter. Gör detta istället:
find . -name "*.java"
Förklaring
Utan citat tolkar skalet *.java
som ett globmönster och expanderar det till alla filnamn som matchar globen innan det skickas till find
. På detta sätt, säg foo.java
i den aktuella katalogen, find
”s faktiska kommandorad skulle vara:
find . -name foo.java
vilket uppenbarligen endast skulle visa filen i den aktuella katalogen (om du inte råkar ha några liknande namn filer längre ner i trädet).
Citat förhindrar globutvidgning och skickar kommandoraden till find
som den är.
För övrigt om globen hade inte matchat (inga *.java
filer i den aktuella direk tory), skulle du få ett av två beteenden beroende på hur ditt skal är inställt för att hantera globs som inte matchar (detta styrs av alternativet nullglob
i Bash, till exempel ):
- Om en glob som inte matchar inte expanderas av skalet kommer
find
(av misstag, kom ihåg dig) att uppvisa korrekt beteende. - Om en glob som inte matchar expanderas till en tom sträng av skalet, kommer
find
att klaga på att det saknas ett argument till-name
.
Svar
Jag hade en liknande situation där jag omgav -namnsvärde i citat, men ändå fick jag inte alla hittträffar som jag hoppades på. Jag antog att det var på grund av symlänkar och nog var det så. Om du vill tvinga söka till att söka genom symlänkar kan du ändra kommandot till följande:
find -L . -name "*.java"
Kommentarer
Svar
Undvik *
find . -name \*.java
-follow
är en mer läsbar synonym för-L
, så länge du lägger den före de andra paramerna.