ディレクトリにたくさんの.htmlファイルがあります。各ファイルを調べて、パターン(MD5)に一致させたい。これらはすべて簡単です。問題は、一致が見つかったファイルを知る必要があることです。
cat *.html | grep 75447A831E943724DD2DE9959E72EE31
一致が見つかったHTMLページのコンテンツのみを返しますが、それが見つかったファイルを教えてくれません。一致が見つかったファイル名を表示するためにgrepを取得するにはどうすればよいですか。
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.
私はこれを常に使用して、ディレクトリ内の文字列を含むファイルを再帰的に探します(つまり、サブサブサブフォルダをトラバースします)grep -Ril "yoursearchtermhere"
R
は、再帰的に検索します(シンボリックリンクをたどります)i
は大文字と小文字を区別しませんl
は、ファイルの名前をリストするだけです。あなたの質問に答えるgrep -l '75447A831E943724DD2DE9959E72EE31' *.html
はできますが、grep -Ril '75447A831E943724DD2DE9959E72EE31'
を実行するだけで、任意のサブフォルダ内のファイルで大文字と小文字を区別せずにその文字列を検索できます
これを試すことができます
grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '
の代替
grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html
上記を行うと、フォルダーとサブフォルダーを再帰的に検索し、ファイルのパスを出力します...
Cyrusによって投稿された答えは絶対に適切であり、正しい方法ですTM ファイルを見つける必要があるだけの場合、grep
でそれを行う。ファイル名で追加の解析または一致したファイル名の操作が必要な場合、while
ループでif
ステートメントを使用することができます。以下は、ファイル名のリストが、ファイル名の安全な解析のために非常に一般的に使用されるfind
+ while
構造に由来する例です。
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