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.
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.
Risposte:
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):
find(accidentalmente, attenzione) mostrerà un comportamento corretto.findsi 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