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

  1. Hvis en glob, der ikke matcher, ikke udvides af skallen, vil find (ved et uheld huske dig) udvise korrekt opførsel.
  2. 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

  • Symlinks var også mit problem. -follow er et mere læsbart synonym for -L, så længe du sætter det foran de andre params.
  • Fantastisk ! Mange tak!! +1!

Svar

Undslip *

find . -name \*.java 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *