195 votes

Comment puis-je "greper" un nom de fichier au lieu du contenu d'un fichier ?

grep est utilisé pour rechercher dans un fichier si une ligne correspond à une expression régulière donnée. Cependant, je suis confronté à la situation suivante : je souhaite écrire une expression régulière qui correspondra au nom de fichier lui-même (et non au contenu du fichier). Je l'exécuterai à partir du répertoire racine du système, afin de trouver tous les fichiers qui correspondent à l'expression régulière.

Par exemple, si je veux trouver tous les Visual Basic qui commencent par un "f" et se terminent par .frm, j'utiliserai l'expression régulière -

   "f[[:alnum:]]*\.frm"

Est-ce que grep peut faire cela ? Si ce n'est pas le cas, existe-t-il un utilitaire qui me permettrait de le faire ?

156voto

Pablo Santa Cruz Points 73944

Vous devez utiliser find au lieu de grep dans ce cas.

Vous pouvez également utiliser find en combinaison avec grep o egrep :

$ find | grep "f[[:alnum:]]\.frm"

119voto

javaPlease42 Points 842

Exemple

find <path> -name '*FileName*'

A partir du manuel :

find -nom motif

La base du nom du fichier (le chemin d'accès avec les premiers répertoires supprimés) correspond au motif de l'interpréteur de commandes. Étant donné que les premiers répertoires sont supprimés, les noms de fichiers pris en compte pour une correspondance avec -name n'incluront jamais de barre oblique. n'incluront jamais de barre oblique, de sorte que "-nom a/b" ne correspondra à rien (vous devrez probablement utiliser -chemin à la place). Les métacaractères ("*", " ?", et "[]") correspondent à un "." au début du nom de base (c'est un changement dans find- utils-4.2.2 ; voir la section CONFORMITÉ AUX NORMES ci-dessous). Pour ignorer un répertoire et les fichiers qui s'y trouvent, utiliser -prune ; voir un exemple dans la description de -path. Les accolades ne sont pas reconnues comme étant spéciales, malgré le fait que certains shells, y compris Bash, donnent aux accolades une signification particulière dans les modèles de shell. La correspondance des noms de fichiers est effectuée à l'aide de la fonction de la bibliothèque fnmatch(3). N'oubliez pas de d'entourer le motif de guillemets afin de le protéger de l'expansion par l'interpréteur de commandes.

58voto

whereswalden Points 622

Comme l'a dit Pablo, vous devez utiliser find au lieu de grep mais il n'est pas nécessaire d'installer un tuyau find a grep . find intègre cette fonctionnalité :

find . -regex 'f[[:alnum:]]\.frm'

find est un programme très puissant de recherche de fichiers par nom, qui prend en charge la recherche par type de fichier, la limitation de la profondeur, la combinaison de différents termes de recherche avec des opérations booléennes et l'exécution de commandes arbitraires sur les fichiers trouvés. Voir la page de manuel find pour plus d'informations.

23voto

un5t0ppab13 Points 55

Vous pouvez trouver le chemin relatif d'un fichier à l'aide de l'arbre. Il suffit d'envoyer la sortie à grep pour filtrer :

tree -f | grep filename

Voici une fonction que vous pouvez placer dans votre .bash_profile , .bashrc , .zshrc ou autre...

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

22voto

sachyy Points 165

La méthode la plus simple consiste à

find . | grep test

Ici trouver listera tous les fichiers dans le (.), c'est-à-dire le répertoire courant, le répertoire récursif et le répertoire de base. répertoire actuel, de manière récursive.

Il s'agit alors d'un simple grep. Tous les fichiers dont le nom contient "test" apparaîtront.

Vous pouvez jouer avec grep selon vos besoins. Remarque : grep est une classification générique des chaînes de caractères. Il peut vous donner non seulement des noms de fichiers. Mais si un chemin contient un répertoire ('/xyz_test_123/other.txt'), celui-ci fera également partie de l'ensemble des résultats.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X