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?
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.
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 cassel
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
Tu peux essayer ça
grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
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 ...
La réponse postée par Cyrus est tout à fait correcte et est la bonne manièreTM le faire avec grep
si 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 while
avec l'instruction if
name__. Voici un exemple où la liste des noms de fichiers provient de la structure très couramment utilisée find
name __ + while
permettant 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