web-dev-qa-db-ja.com

特定の拡張子を持つファイルで特定のテキストを見つける方法

abcのテキストを含む.log拡張子を持つすべてのファイルを検索するとします。

任意の拡張子を持つファイルを検索すると、次のようになります(参照: https://unix.stackexchange.com/a/16140/3835

find / -xdev -type f -print0 | xargs -0 grep -H "abc"

.log拡張子を持つファイルのみを検索するようにこれをどのように変更できますか?

より良いコマンドを表示していただければ幸いです。

1
Askar

TL; DR

-iname "*.log"の後に/findコマンドに追加します。詳細については、manページを参照してください

より詳細な回答

当面のタスクは次のとおりです。

  1. パターンに一致するファイルをリスト*.log
  2. 各ファイルごとにgrepを実行して、特定の文字列が含まれているかどうかを確認します。
  3. 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は、文字列のないファイルと一致します。
3