grep - liste le nom du fichier où se trouve la correspondance

31

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 simple. 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 le fichier dans lequel il a été trouvé. Comment puis-je obtenir grep pour me montrer le nom de fichier où ma correspondance est trouvée?

Soit mon ami
la source
La suggestion fournie ne fonctionne vraiment pas .... Tout ce que j'obtiens est «entrée standard» cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (entrée standard): <html> <head> <title>
BeMy Friend
4
vous manquez le point. Vous n'avez pas besoin d'utiliser le chat. Le chat empêche grep de distinguer les fichiers individuels.
muru
Vous pourriez trouver utile ce post Stack Overflow .
Pablo A

Réponses:

32
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.
Cyrus
la source
3
Comme il est dit, c'est la valeur par défaut pour plusieurs fichiers, donc tant qu'il y a plus d'un fichier html, ce -Hn'est pas nécessaire.
muru
1
Désolé ma question était offensante. J'aurais dû dire que j'y travaille depuis un certain temps et que j'ai utilisé un certain nombre de commutateurs ET que j'ai lu la page MAN où il est indiqué qu'il répertorie le nom de fichier par défaut .... Mais ce que j'obtiens est (entrée standard ) où il doit répertorier le nom de fichier.
BeMy Friend
et c'est seulement si je donne le commutateur -H. Si je ne fais que ce que j'ai répertorié dans l'OP, il ne fournit aucun nom de fichier.
BeMy Friend
3
@BeMyFriend, le problème est cat. catsignifie concaténer. Si vous concaténez tous les fichiers ensemble avant de les transmettre grep, ne grepvoyez qu'un seul gros fichier d'entrée standard et ne pouvez pas (à moins de faire de la divination) vous rendre des informations sur les fichiers uniques. Voir?. Cyrus, qu'en est-il d'expliquer cela dans la réponse?
Rmano
OK, le problème est la commande cat, mais quelle peut être une solution?
Josef Klimuk
21

J'utilise celui-ci tout le temps pour rechercher des fichiers contenant une chaîne, RECURIVEMENT dans un répertoire (cela signifie, traversant n'importe quel sous-sous-dossier) grep -Ril "yoursearchtermhere"

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

donc répondre à votre question grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlfera l'affaire mais vous pouvez juste faire grep -Ril '75447A831E943724DD2DE9959E72EE31'pour chercher cette chaîne, insensible à la casse, dans n'importe quel fichier dans n'importe quel sous-dossier

thebugfinder
la source
macOS nécessite toujours une définition de fichier, qu'il s'agisse d'un caractère générique. Sinon, il suppose l'entrée de stdin( grep: avertissement: recherche récursive de stdin , quelle que soit l'entrée récursive stdin :-). En d'autres termes:grep -Ril 'texttofind' *
Ville
grep -RiH 'pattern'affiche le nom des fichiers et la ligne correspondante
Ikrom
7

Vous pouvez essayer ceci

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

Alternative à

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

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

A dessiné
la source
grep -r -l est la seule chose qui a fonctionné pour moi.
Josef Klimuk
0

La réponse publié par Cyrus est absolument propre et est la bonne façon TM de le faire avec grepsi nous ne devons trouver des fichiers . Lorsque les noms de fichiers doivent effectuer une analyse ou des opérations supplémentaires sur les noms de fichiers correspondants, nous pouvons recourir à l'utilisation de la whileboucle avec ifinstruction. Voici un exemple où la liste des noms de fichiers provient d'une structure find+ très couramment utilisée whilepour une analyse sécurisée 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
Sergiy Kolodyazhnyy
la source
1
En relation: Rechercher récursivement un motif / texte uniquement dans le nom de fichier spécifié d'un répertoire? , en particulier la réponse de muru démontrant greple --includedrapeau de.
Eliah Kagan