現在のディレクトリとサブディレクトリ内のすべてのファイルをループして文字列を検索するにはどうすればよいでしょうか?

現在のディレクトリとサブディレクトリ内のすべてのファイルをループして文字列を検索するにはどうすればよいでしょうか?

こんにちは。たとえば、すべてのファイルで文字列「foo」を見つけるために、ディレクトリとそのすべてのサブディレクトリをループしようとしています。次に、その文字列を含むすべてのファイルのファイル名 (フルパスを含む) を表示したいと思います。

オペレーティング システムは Unix で、bash シェルを使用します。

何かご提案がありましたら、ぜひお聞かせください。ありがとうございます

答え1

再帰的な を使うことができますgrepgrep少なくとも GNU では、それが-Rオプションです:

grep -R foo /path/to/parent/directory

たとえば、上記のようにフルパスを使用すると、/home/callsign223/foo/すべてのファイルが修飾パスとともに表示されます。一致する行ではなくファイル名のみを表示したい場合は、次のようにして-lファイル名のみを印刷できます。

grep -lR foo /path/to/parent/directory

この-Rオプションは移植性がなく、すべてのgrep実装でサポートされているわけではないことに注意してください。

答え2

grep -Rがオプションでない場合は、各ファイルでfind実行するために使用できます。grep

find ./ -type f -exec grep -Hni "some-string" {} ';'

答え3

現在のすべての Unix システムで機能するのは、 を使用しfindてファイルを検索し、grep文字列を含むファイルを識別することですfoo

find . -type f -exec grep -l -F -e 'foo' {} +

上記のコマンドは、現在のディレクトリ内またはその下にあるすべての通常ファイルを検索します。見つかったファイルのバッチの場合、grep文字列を検索するために が呼び出されますfoo。ファイル内で文字列を検索すると、grepファイルのパス名が直ちに出力され、現在のファイルからそれ以上読み取らずに次のファイルに進みます。

  • -l指定されたパターンに一致する最初の行で停止し、ファイル名を報告するために使用しますgrep。これにより、最初のヒット後のファイルのビットが無視され、処理が高速化されます。
  • -Fパターンを正規表現ではなく文字列として扱うために を使用しますgrep。これにより、正規表現の一致を試みないことで処理速度が向上する可能性があり、正規表現のように見える文字列を一致させることができます。
  • 指定されたパターンがダッシュで始まる場合に備えて、を使用します-e。この例ではそうはなりませんが、その静的文字列をfoo変数に置き換えると、ダッシュで始まるパターンと一致する可能性が生じ、その結果、コマンドライン オプションと間違われることになります。

findただし、ファイル名のリストは通常​​役に立ちません。これらのファイルに対して何らかの操作を行う必要があるでしょう。その場合は、以下を実行するユーティリティの一部としてそれを実行します-exec

find . -type f -exec sh -c '
    for pathname do
        grep -q -F -e "foo" "$pathname" || continue
        # Do something with "$pathname" here
    done' sh {} +

ここでは、見つかったファイルをバッチで処理するための短いインライン スクリプトを呼び出します。各ファイルを個別にチェックして文字列 を探しfoo、文字列を含まないファイルは無視します。インライン スクリプトにコメントを追加した場所では、 によって参照されるファイルを処理します"$pathname"

インライン スクリプトを呼び出す前に、上記を個別にfind実行するように記述することもできます。grep

find . -type f -exec grep -q -F -e 'foo' {} \; -exec sh -c '
    for pathname do
        # Do something with "$pathname" here
    done' sh {} +

最初の関数が、そのテストに合格したファイルを-exec呼び出す前に、現在のファイルに対してどのようにテストとして機能するかに注意してください。sh -c

答え4

このユーティリティはまさにあなたが求めている機能を果たすと思いますack。すでにシステムにインストールされているかもしれません。そうでない場合は、以下からダウンロードできます。参考:

の優れた機能の 1 つackは、デフォルトでバイナリ ファイルを無視し、コマンド ライン オプションを指定して、検索するファイルのタイプを、規定のフィルターまたはファイル タイプ (プログラミング言語別など: は、、ファイルを検索し、は最初の行に一致するすべてのファイルを検索します) によって制限できることです。これら--type=ccのタイプは、ユーザーがコマンド ラインで拡張することも、ファイル内でより永続的に拡張することもできます。.c.h.xs--type=awk/awk/~/.ackrc

関連情報