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 find
solo nella directory corrente. Sto usando OS X, 10.9.
Risposta
Il problema è che non hai “citato il tuo . Procedi in questo modo:
find . -name "*.java"
Spiegazione
Senza virgolette, la shell interpreta *.java
come un modello glob e lo espande a qualsiasi nome di file corrispondente al glob prima di passarlo a find
. In questo modo, se avessi, ad esempio, foo.java
nella directory corrente, find
“la riga di comando effettiva sarebbe:
find . -name foo.java
che ovviamente elenca solo il file nella directory corrente (a meno che tu non abbia qualche nome simile file più in basso nellalbero).
Le virgolette impediscono lespansione di glob e passano la riga di comando a find
così comè.
Per inciso, se il glob non era riuscito a trovare una corrispondenza (nessun file *.java
nella directory corrente tory), potresti ottenere uno dei due comportamenti a seconda di come la tua shell è impostata per gestire i glob che non corrispondono (questo è governato dallopzione nullglob
in Bash, per esempio ):
- Se un glob che non corrisponde non viene espanso dalla shell,
find
mostrerà (accidentalmente, badate bene) un comportamento corretto. - Se un glob che non “t corrisponde viene espanso in una stringa vuota dalla shell,
find
si lamenterà che manca un argomento per-name
.
Risposta
Ho avuto una situazione simile in cui mi trovavo intorno al -name valore tra virgolette, ma non riuscivo ancora a ottenere tutti i risultati di ricerca che speravo. Ho ipotizzato che fosse a causa dei collegamenti simbolici e abbastanza sicuro che fosse il caso. Se vuoi forzare la ricerca per la ricerca attraverso i link simbolici, puoi modificare il comando in questo modo:
find -L . -name "*.java"
Commenti
Risposta
Scappa da *
find . -name \*.java
-follow
è un sinonimo più leggibile di-L
, a patto di metterlo prima degli altri parametri.