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

  1. Om en glob som inte matchar inte expanderas av skalet kommer find (av misstag, kom ihåg dig) att uppvisa korrekt beteende.
  2. 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

  • Symlänkar var också mitt problem. -follow är en mer läsbar synonym för -L, så länge du lägger den före de andra paramerna.
  • Bra ! Tack så mycket!! +1!

Svar

Undvik *

find . -name \*.java 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *