(Je suppose que GNU findici)
En utilisant juste
find filename
serait rapide, car il retournerait simplement filename, ou les noms à l'intérieur filenames'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 filenames'agit d'un répertoire).
En revanche,
find | grep filename
permettrait findde générer une liste de tous les noms à partir du répertoire courant et ci-dessous, qui grepfiltrerait 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 filenamele 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 grepsolution correspondrait filenameau 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 findfonctionnement.
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 findde lister tous les noms disponibles sous les trois chemins a, bet 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' filenameutilisation -name 'filename'. La chaîne filenamepeut ê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é .profiledans 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 cdmonte d'un niveau et réessaye:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
La findcommande 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