(Sto assumendo GNU findqui)
Usando solo
find filename
sarebbe veloce, perché sarebbe semplicemente restituito filename, o i nomi all'interno filenamese fosse una directory, o un errore se quel nome non esistesse nella directory corrente. È un'operazione molto rapida, simile a ls filename(ma ricorsiva se filenameè una directory).
In contrasto,
find | grep filename
consentirebbe finddi generare un elenco di tutti i nomi dalla directory corrente e inferiore, che grepquindi filtrerebbe. Questa sarebbe ovviamente un'operazione molto più lenta.
Suppongo che ciò che era effettivamente previsto fosse
find . -type f -name 'filename'
Questo cercherebbe filenamecome nome di un file normale in qualsiasi punto della directory corrente o in basso.
Sarà rapido (o comparativamente rapido) find | grep filename, ma la grepsoluzione corrisponderebbe filenameal percorso completo di ciascun nome trovato, in modo simile a quello che -path '*filename*'farebbe find.
La confusione deriva da un malinteso su come findfunziona.
L'utilità accetta numerosi percorsi e restituisce tutti i nomi al di sotto di questi percorsi.
È quindi possibile limitare i nomi restituiti utilizzando vari test che possono agire sul nome file, sul percorso, sul timestamp, sulla dimensione del file, sul tipo di file, ecc.
Quando dici
find a b c
si chiede finddi elencare tutti i nomi sotto i tre percorsi a, be c. Se si tratta di nomi di file regolari nella directory corrente, verranno restituiti. Se qualcuno di loro è il nome di una directory, verrà restituito insieme a tutti gli altri nomi all'interno di quella directory.
Quando io faccio
find . -type f -name 'filename'
Questo genera un elenco di tutti i nomi nella directory corrente ( .) e in basso. Quindi limita i nomi a quelli dei normali file, cioè non alle directory ecc., Con -type f. Quindi c'è un'ulteriore limitazione ai nomi che corrispondono a filenameusando -name 'filename'. La stringa filenamepuò essere un modello globbing di nome file, ad esempio *.txt(ricordati di citare!).
Esempio:
Quanto segue sembra "trovare" il file chiamato .profilenella mia home directory:
$ pwd
/home/kk
$ find .profile
.profile
Ma in effetti, restituisce solo tutti i nomi nel percorso .profile(c'è solo un nome, e questo è di questo file).
Quindi cdsalgo di un livello e riprovo:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Il findcomando non può ora trovare alcun percorso chiamato .profile.
Tuttavia, se riesco a esaminare la directory corrente e quindi limitare solo i nomi restituiti.profile , lo trova anche da lì:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile