
こんにちは。たとえば、すべてのファイルで文字列「foo」を見つけるために、ディレクトリとそのすべてのサブディレクトリをループしようとしています。次に、その文字列を含むすべてのファイルのファイル名 (フルパスを含む) を表示したいと思います。
オペレーティング システムは Unix で、bash シェルを使用します。
何かご提案がありましたら、ぜひお聞かせください。ありがとうございます
答え1
再帰的な を使うことができますgrep
。grep
少なくとも 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