45 votes

grep -- liste les noms de fichiers où la correspondance a été trouvée

J'ai un tas de fichiers .html dans un répertoire. Je veux parcourir chaque fichier et faire correspondre un modèle (MD5). Tout cela est assez facile. Le problème est que j'ai besoin de savoir dans quel fichier la correspondance a été trouvée.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Il ne renvoie que le contenu de la page HTML où la correspondance a été trouvée, mais il ne m'indique pas le fichier dans lequel elle a été trouvée. Comment puis-je faire en sorte que grep m'indique le nom du fichier dans lequel la correspondance a été trouvée ?

55voto

Cyrus Points 4962
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

27voto

thebugfinder Points 2016

Je l'utilise tout le temps pour rechercher des fichiers contenant une chaîne de caractères, RECURSIVEMENT dans un répertoire (c'est-à-dire, en parcourant n'importe quel sous-sous-sous dossier). grep -Ril "yoursearchtermhere"

  • R est de faire une recherche récursive (en suivant les liens symboliques)
  • i est de le rendre insensible à la casse
  • l consiste simplement à énumérer le nom des fichiers.

Pour répondre à votre question grep -l '75447A831E943724DD2DE9959E72EE31' *.html le fera mais vous pouvez simplement faire grep -Ril '75447A831E943724DD2DE9959E72EE31' pour rechercher cette chaîne, sans tenir compte de la casse, dans n'importe quel fichier de n'importe quel sous-dossier

8voto

Red Aura Points 428

Vous pouvez essayer ceci

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt

3voto

Drew Points 31
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternative à

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

La procédure ci-dessus permet d'effectuer une recherche récursive dans le dossier et les sous-dossiers et d'imprimer le chemin d'accès au fichier...

0voto

Sergiy Kolodyazhnyy Points 97292

La réponse apportée par Cyrus est tout à fait correcte et constitue la bonne voie. TM pour le faire avec grep si nous il suffit de trouver les fichiers . Lorsque les noms de fichiers doivent être analyse supplémentaire ou des opérations sur les noms de fichiers correspondants, nous pouvons recourir à l'utilisation de while boucle avec if déclaration. Voici un exemple où la liste des noms de fichiers provient de l'instruction très couramment utilisée find + while pour une analyse sûre des noms de fichiers.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X