Perché la mia scoperta non è ricorsiva?


65

Sto eseguendo il seguente comando, ma non viene eseguito in modo ricorsivo:

find . -name *.java

So che ci sono file java più in basso nella directory corrente ma sta eseguendo solo findsulla directory corrente. Sto usando OS X, 10.9.


@Gilles: questo Q&A è molto più chiaro e meno localizzato rispetto al dupe - se uno di loro dovrebbe essere chiuso, è l'altro.
Riccioli d'oro

Risposte:


88

Il problema è che non hai citato il tuo -nameparametro. Fallo invece:

find . -name '*.java'

Spiegazione

Senza le virgolette, la shell interpreta *.javaun modello glob e lo espande a tutti i nomi di file corrispondenti al glob prima di passarlo a find. In questo modo, se avessi, diciamo, foo.javanella directory corrente, findla riga di comando effettiva sarebbe:

find . -name foo.java

che ovviamente elenca il file solo nella directory corrente (a meno che non ci sia qualche file con un nome simile più in basso nella struttura).

La citazione impedisce l'espansione globale e passa la riga di comando così findcom'è.

Per inciso, se il glob non fosse riuscito a trovare la corrispondenza (nessun *.javafile nella directory corrente), otterresti uno dei due comportamenti a seconda di come è impostata la tua shell per gestire globs che non corrispondono (questo è regolato nullglobdall'opzione in Bash , per esempio):

  1. Se un glob che non corrisponde non viene espanso dalla shell, find(accidentalmente, attenzione) mostrerà un comportamento corretto.
  2. Se un glob che non corrisponde viene espanso in una stringa vuota dalla shell, findsi lamenterà che manca un argomento -name.

20

Ho avuto una situazione simile in cui circondavo il valore -name tra virgolette, ma non riuscivo ancora a ottenere tutti i successi di ricerca che speravo. Ho ipotizzato che fosse a causa di collegamenti simbolici e abbastanza sicuro che fosse il caso. Se si desidera forzare find a cercare tramite symlink, è possibile modificare il comando nel modo seguente:

find -L . -name '*.java'

Anche i link simbolici erano il mio problema. -followè un sinonimo più leggibile -L, a patto che lo metta davanti agli altri parametri.
Noumenon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.