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 find
sulla directory corrente. Sto usando OS X, 10.9.
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 find
sulla directory corrente. Sto usando OS X, 10.9.
Risposte:
Il problema è che non hai citato il tuo -name
parametro. Fallo invece:
find . -name '*.java'
Spiegazione
Senza le virgolette, la shell interpreta *.java
un 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.java
nella directory corrente, find
la 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ì find
com'è.
Per inciso, se il glob non fosse riuscito a trovare la corrispondenza (nessun *.java
file nella directory corrente), otterresti uno dei due comportamenti a seconda di come è impostata la tua shell per gestire globs che non corrispondono (questo è regolato nullglob
dall'opzione in Bash , per esempio):
find
(accidentalmente, attenzione) mostrerà un comportamento corretto.find
si lamenterà che manca un argomento -name
.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'
-follow
è un sinonimo più leggibile -L
, a patto che lo metta davanti agli altri parametri.
Sfuggire al *
find . -name \*.java