abc
のテキストを含む.log
拡張子を持つすべてのファイルを検索するとします。
任意の拡張子を持つファイルを検索すると、次のようになります(参照: https://unix.stackexchange.com/a/16140/3835 )
find / -xdev -type f -print0 | xargs -0 grep -H "abc"
.log
拡張子を持つファイルのみを検索するようにこれをどのように変更できますか?
より良いコマンドを表示していただければ幸いです。
TL; DR
-iname "*.log"
の後に/
をfind
コマンドに追加します。詳細については、manページを参照してください
より詳細な回答
当面のタスクは次のとおりです。
*.log
grep
を実行して、特定の文字列が含まれているかどうかを確認します。stdout
に一致するファイル名をリストしますそれを実現する方法の例を以下に示します。
$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+
基本的に、次の3つのことが行われます。
find
は、ファイルを検索し、-exec ...{} \+
構造内のファイル名のリストごとにgrep
を呼び出します。{}
は、見つかったすべてのファイル名に置き換えられます。-iname "*.log"
は、ファイル名の大文字と小文字を区別しないマッチングを提供できます-exec . . .{} \+
は低レベルのexecve
関数を呼び出し、grep -l
の前にあるすべてのファイルのリスト({}
の場所)を生成します。\+
は、execve
の前に可能な限りファイルをパックするようにgrep
を指定するオプションです(制限はARG_MAX
変数で設定され、exec
、およびUbuntuの場合は、2097152
コマンドで示されるようにgetconf ARG_MAX
にあります)。制限に達すると、exec
は引数としてパックされたファイルをさらに使用してgrep
の呼び出しを繰り返します。 \
は、+
が別のシェルコマンドとしてではなく、find
への引数として解釈されるようにするために必要です。-l
オプションまたはgrepは、一致した文字列を持つファイルを表示します。 -L
は、文字列のないファイルと一致します。