現在のディレクトリとサブディレクトリのすべてのファイルを繰り返して文字列を見つけるにはどうすればよいですか? [閉鎖]

現在のディレクトリとサブディレクトリのすべてのファイルを繰り返して文字列を見つけるにはどうすればよいですか? [閉鎖]

こんにちは、たとえば、私はすべてのファイルで文字列 "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以下を使用して各ファイルで実行できますfindgrep

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。システムにすでにインストールされている可能性があります。そうでない場合は、次のURLからダウンロードできます。https://beyondgrep.com/

の良い機能ackは、基本的にバイナリファイルを無視し、コマンドラインオプションを指定して、指定されたフィルタまたはファイルタイプで検索されるファイルタイプを制限できることです(たとえば、プログラミング言語:、、、ファイルを--type=cc検索し.cて一致するすべてのファイルを検索します)。最初の行に)。ユーザーは、コマンドラインまたはファイルから永久にこれらのタイプを拡張することもできます。.h.xs--type=awk/awk/~/.ackrc

関連情報