こんにちは、たとえば、私はすべてのファイルで文字列 "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
。システムにすでにインストールされている可能性があります。そうでない場合は、次のURLからダウンロードできます。https://beyondgrep.com/。
の良い機能ack
は、基本的にバイナリファイルを無視し、コマンドラインオプションを指定して、指定されたフィルタまたはファイルタイプで検索されるファイルタイプを制限できることです(たとえば、プログラミング言語:、、、ファイルを--type=cc
検索し.c
て一致するすべてのファイルを検索します)。最初の行に)。ユーザーは、コマンドラインまたはファイルから永久にこれらのタイプを拡張することもできます。.h
.xs
--type=awk
/awk/
~/.ackrc