Jeg kører følgende kommando, men den udføres ikke rekursivt:
find . -name *.java
Jeg ved, at der er java-filer længere nede i den aktuelle mappe, men den udfører kun find
i den aktuelle mappe. Jeg bruger OS X, 10.9.
Svar
Problemet er, at du ikke citerede din -name
-parameter. Gør dette i stedet:
find . -name "*.java"
Forklaring
Uden anførselstegn fortolker skallen *.java
som et globmønster og udvider det til alle filnavne, der matcher globen, før det sendes til find
. På denne måde, hvis du siger, foo.java
i den aktuelle mappe, find
“s faktiske kommandolinje ville være:
find . -name foo.java
som tydeligvis kun vil vise filen i den aktuelle mappe (medmindre du tilfældigvis har nogle lignende navngivne filer længere nede i træet).
Citering forhindrer glob-udvidelse og sender kommandolinjen til find
som den er.
I øvrigt hvis globen kunne ikke matche (ingen *.java
filer i den aktuelle direc tory), ville du få en af to adfærd afhængigt af, hvordan din shell er indstillet til at håndtere globs, der ikke matcher (dette styres af nullglob
i Bash, for eksempel ):
- Hvis en glob, der ikke matcher, ikke udvides af skallen, vil
find
(ved et uheld huske dig) udvise korrekt opførsel. - Hvis en glob, der ikke matcher, udvides til en tom streng af skallen, vil
find
klage over, at den mangler et argument til-name
.
Svar
Jeg havde en lignende situation, hvor jeg omgav -navn værdi i anførselstegn, men stadig ikke fik alle de find hits, som jeg håbede på. Jeg formodede at det var på grund af symlinks og sikkert nok var det tilfældet. Hvis du vil tvinge søgning til at søge gennem symlinks, kan du ændre kommandoen til følgende:
find -L . -name "*.java"
Kommentarer
Svar
Undslip *
find . -name \*.java
-follow
er et mere læsbart synonym for-L
, så længe du sætter det foran de andre params.