web-dev-qa-db-fra.com

grep - liste le nom du fichier où la correspondance est trouvée

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

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Renvoie uniquement le contenu de la page HTML où la correspondance est trouvée, mais il ne me dit pas dans quel fichier il a été trouvé. Comment puis-je obtenir que grep me montre le nom du fichier où se trouve ma correspondance?

27
BeMy Friend
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.
29
Cyrus

J'utilise celui-ci tout le temps pour rechercher des fichiers contenant une chaîne, RÉCURSIVEMENT dans un répertoire (c'est-à-dire traversant n'importe quel sous-sous-dossier) grep -Ril "yoursearchtermhere"

  • R est à rechercher récursivement (liens symboliques suivants)
  • i est de le rendre insensible à la casse
  • l est juste pour lister le nom des fichiers.

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

17
thebugfinder

Tu peux essayer ça

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
7
Red Aura
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternative à

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Faire ci-dessus va chercher récursivement dans le dossier et les sous-dossiers et afficher le chemin du fichier ...

1
Drew

La réponse postée par Cyrus est tout à fait correcte et est la bonne manièreTM le faire avec grepsi nous seulement besoin de trouver des fichiers. Lorsque les noms de fichiers doivent analyse supplémentaire ou les opérations sur les noms de fichiers correspondants, nous pouvons recourir à la boucle whileavec l'instruction ifname__. Voici un exemple où la liste des noms de fichiers provient de la structure très couramment utilisée findname __ + whilepermettant une analyse en toute sécurité 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
0