(Sto assumendo GNU find
qui)
Usando solo
find filename
sarebbe veloce, perché sarebbe semplicemente restituito filename
, o i nomi all'interno filename
se 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 find
di generare un elenco di tutti i nomi dalla directory corrente e inferiore, che grep
quindi filtrerebbe. Questa sarebbe ovviamente un'operazione molto più lenta.
Suppongo che ciò che era effettivamente previsto fosse
find . -type f -name 'filename'
Questo cercherebbe filename
come nome di un file normale in qualsiasi punto della directory corrente o in basso.
Sarà rapido (o comparativamente rapido) find | grep filename
, ma la grep
soluzione corrisponderebbe filename
al percorso completo di ciascun nome trovato, in modo simile a quello che -path '*filename*'
farebbe find
.
La confusione deriva da un malinteso su come find
funziona.
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 find
di elencare tutti i nomi sotto i tre percorsi a
, b
e 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 filename
usando -name 'filename'
. La stringa filename
può essere un modello globbing di nome file, ad esempio *.txt
(ricordati di citare!).
Esempio:
Quanto segue sembra "trovare" il file chiamato .profile
nella 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 cd
salgo di un livello e riprovo:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Il find
comando 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