Comment puis-je utiliser grep pour afficher uniquement les noms de fichiers sous Linux?

1068

Comment puis-je utiliser greppour afficher uniquement les noms de fichiers (aucune correspondance en ligne) sous Linux?

J'utilise généralement quelque chose comme:

find . -iname "*php" -exec grep -H myString {} \;

Comment puis-je simplement obtenir les noms de fichiers (avec des chemins), mais sans les correspondances? Dois-je utiliser xargs? Je n'ai pas vu de moyen de le faire sur ma greppage de manuel.

cwd
la source
3
Vous voulez dire que vous voulez les noms de fichiers qui ont au moins une correspondance?
leonbloy
4
Grande question. En fait, j'ai commencé à l'utiliser pour ouvrir une liste de fichiers renvoyés par grep dans Vim. vim $(grep -rl Something app/)
David Tuite
1
Vous ne pouvez pas lister les fichiers à l'aide de la commande grep, elle est essentiellement utilisée pour récupérer le texte souhaité dans un fichier ou une liste. Par exemple, ps aux | grep 'apt-get' ou grep 'text-to-find' / path / to / file /
iamjayp

Réponses:

1625

L'option standard grep -l(c'est-à-dire un L en minuscule) pourrait le faire.

De la norme Unix :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

Vous n'avez également pas besoin -Hdans ce cas.

Aléatoire832
la source
37
La documentation de cette option est (comme souvent dans la plupart des fichiers man) si peu claire! Pfff… Incroyable comment l'homme peut être une douleur dans le cul.
MonsieurDart
1
-H montre également les matchs eux-mêmes. La question concernait uniquement les noms de fichiers.
Hauke
@Hauke ​​Et ma réponse était -l. J'ai mentionné -H uniquement parce que la commande de l'utilisateur dans la question incluait -H et elle est redondante lorsque -l est donnée.
Random832
2
Bien, j'aime personnellement l'utiliser avec d'autres indicateurs grep -nrl "some text" .lorsque je recherche du texte dans un ensemble de sous-dossiers de manière récursive
openwonk
142

Depuis la grep(1)page de manuel:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)
Ignacio Vazquez-Abrams
la source
4
L'arrêt au premier match est nécessaire et naturel.
Thomson
7
la documentation le rend un peu flou. "L'analyse s'arrêtera à la première correspondance" - indique que tous les noms de fichiers seront imprimés, mais l'analyse du mot correspondant s'arrêtera à la première occurrence.
TheMonkWhoSoldHisCode
2
@VishalP: Étant donné que nous ne nous soucions pas de l'emplacement des occurrences, mais seulement de leur existence, il est inutile de rechercher chaque fichier au-delà de la première occurrence.
Ignacio Vazquez-Abrams
17
@ IgnacioVazquez-Abrams Exactement. La première impression du document vous donne l'impression qu'il n'imprimera que le nom de fichier du premier fichier. Vous avez vraiment besoin de quelques lectures pour le comprendre.
TheMonkWhoSoldHisCode
5
"L'analyse du fichier actuel s'arrêtera lors du premier match." serait beaucoup plus clair.
sorrymissjackson
37

Pour une recherche de fichier simple, vous pouvez utiliser les options -let grep -r:

grep -rl "mystring"

Toutes les recherches sont effectuées par grep. Bien sûr, si vous devez sélectionner des fichiers sur un autre paramètre, find est la bonne solution:

find . -iname "*.php" -execdir grep -l "mystring" {} +

L' execdiroption crée chaque commande grep pour chaque répertoire et concatène les noms de fichiers en une seule commande ( +).

l'homme d'étain
la source
0

Votre question Comment puis-je simplement obtenir les noms de fichiers (avec des chemins)

Votre exemple de syntaxe find. -iname "* php" -exec grep -H myString {} \;

Ma suggestion de commande

sudo find /home -name *.php

La sortie de cette commande sur mon OS Linux:

compose-sample-3 / html / mail / contact_me.php

Comme vous avez besoin du nom de fichier avec chemin, profitez-en!

apl
la source
La question demande spécifiquement comment ils obtiennent les noms de fichiers en utilisant grep .
snakecharmerb