Jeg kjører følgende kommando, men den utføres ikke rekursivt:
find . -name *.java
Jeg vet at det er java-filer lenger nede i den nåværende katalogen, men den utfører find
bare i den aktuelle katalogen. Jeg bruker OS X, 10.9.
Svar
Problemet er at du ikke siterte -name
parameter. Gjør dette i stedet:
find . -name "*.java"
Forklaring
Uten anførselstegn tolker skallet *.java
som et globmønster og utvider det til alle filnavn som samsvarer med globen før det sendes til find
. Hvis du hadde, si, foo.java
i denne katalogen, find
«s faktiske kommandolinje vil være:
find . -name foo.java
som tydeligvis bare vil føre filen opp i den aktuelle katalogen (med mindre du tilfeldigvis har noen lignende navn filer lenger nede i treet).
Sitering forhindrer utvidelse av glob og sender kommandolinjen til find
som den er.
Forresten, hvis kloden kunne ikke matche (ingen *.java
filer i gjeldende direk tory), vil du få en av to atferd, avhengig av hvordan skallet ditt er konfigurert for å håndtere globs som ikke samsvarer (dette styres av nullglob
-alternativet i Bash, for eksempel ):
- Hvis en glob som ikke stemmer overens, ikke utvides av skallet, vil
find
(ved et uhell, husk deg) vise riktig oppførsel. - Hvis en glob som ikke stemmer overens, utvides til en tom streng av skallet, vil
find
klage over at det mangler et argument til-name
.
Svar
Jeg hadde en lignende situasjon der jeg omgav -navnverdi i anførselstegn, men fikk fremdeles ikke alle de treffene jeg håpet på. Jeg antok at det var på grunn av symlinker og helt sikkert at det var tilfelle. Hvis du vil tvinge søke til å søke gjennom symlenker, kan du endre kommandoen til følgende:
find -L . -name "*.java"
Kommentarer
Svar
Unnslipp *
find . -name \*.java
-follow
er et mer lesbart synonym for-L
, så lenge du setter det foran de andre paramene.