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

  1. Hvis en glob som ikke stemmer overens, ikke utvides av skallet, vil find (ved et uhell, husk deg) vise riktig oppførsel.
  2. 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

  • Symlinker var også problemet mitt. -follow er et mer lesbart synonym for -L, så lenge du setter det foran de andre paramene.
  • Flott ! Takk så mye!! +1!

Svar

Unnslipp *

find . -name \*.java 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *