(Je suppose que GNU find
ici)
En utilisant juste
find filename
serait rapide, car il retournerait simplement filename
, ou les noms à l'intérieur filename
s'il s'agit d'un répertoire, ou une erreur si ce nom n'existait pas dans le répertoire courant. C'est une opération très rapide, similaire à ls filename
(mais récursive s'il filename
s'agit d'un répertoire).
En revanche,
find | grep filename
permettrait find
de générer une liste de tous les noms à partir du répertoire courant et ci-dessous, qui grep
filtrerait ensuite. Ce serait évidemment une opération beaucoup plus lente.
Je suppose que ce qui était réellement prévu était
find . -type f -name 'filename'
Ce serait filename
le nom d'un fichier normal n'importe où dans le répertoire courant ou en dessous.
Ce sera aussi rapide (ou relativement rapide) que find | grep filename
, mais la grep
solution correspondrait filename
au chemin complet de chaque nom trouvé, de manière similaire à ce qui -path '*filename*'
serait fait avec find
.
La confusion vient d'un malentendu sur le find
fonctionnement.
L'utilitaire prend un certain nombre de chemins et renvoie tous les noms sous ces chemins.
Vous pouvez ensuite restreindre les noms retournés à l'aide de divers tests qui peuvent agir sur le nom de fichier, le chemin, l'horodatage, la taille du fichier, le type de fichier, etc.
Quand tu dis
find a b c
vous demandez find
de lister tous les noms disponibles sous les trois chemins a
, b
et c
. S'il se trouve que ce sont des noms de fichiers normaux dans le répertoire courant, ils seront retournés. Si l'un d'eux se trouve être le nom d'un répertoire, il sera renvoyé avec tous les autres noms à l'intérieur de ce répertoire.
Quand je fais
find . -type f -name 'filename'
Cela génère une liste de tous les noms dans le répertoire courant ( .
) et ci-dessous. Ensuite, il restreint les noms à ceux des fichiers normaux, c'est-à-dire pas des répertoires, etc. avec -type f
. Ensuite, il y a une autre restriction aux noms qui correspondent à l' filename
utilisation -name 'filename'
. La chaîne filename
peut être un modèle de remplacement de nom de fichier, tel que *.txt
(n'oubliez pas de le citer!).
Exemple:
Ce qui suit semble "trouver" le fichier appelé .profile
dans mon répertoire personnel:
$ pwd
/home/kk
$ find .profile
.profile
Mais en fait, il retourne juste tous les noms sur le chemin .profile
(il n'y a qu'un seul nom, et c'est de ce fichier).
Ensuite, je cd
monte d'un niveau et réessaye:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
La find
commande ne trouve plus aucun chemin appelé .profile
.
Cependant, si je le fais regarder le répertoire en cours, puis restreindre les noms retournés à seulement.profile
, il le trouve également à partir de là:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile