web-dev-qa-db-ja.com

grep-一致が見つかったファイル名のリスト

ディレクトリにたくさんの.htmlファイルがあります。各ファイルを調べて、パターン(MD5)に一致させたい。これらはすべて簡単です。問題は、一致が見つかったファイルを知る必要があることです。

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

一致が見つかったHTMLページのコンテンツのみを返しますが、それが見つかったファイルを教えてくれません。一致が見つかったファイル名を表示するためにgrepを取得するにはどうすればよいですか。

30
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.
31
Cyrus

私はこれを常に使用して、ディレクトリ内の文字列を含むファイルを再帰的に探します(つまり、サブサブサブフォルダをトラバースします)grep -Ril "yoursearchtermhere"

  • Rは、再帰的に検索します(シンボリックリンクをたどります)
  • iは大文字と小文字を区別しません
  • lは、ファイルの名前をリストするだけです。

あなたの質問に答えるgrep -l '75447A831E943724DD2DE9959E72EE31' *.htmlはできますが、grep -Ril '75447A831E943724DD2DE9959E72EE31'を実行するだけで、任意のサブフォルダ内のファイルで大文字と小文字を区別せずにその文字列を検索できます

19
thebugfinder

これを試すことができます

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

の代替

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

上記を行うと、フォルダーとサブフォルダーを再帰的に検索し、ファイルのパスを出力します...

1
Drew

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
0