イベントベースのディレクトリ構造があります。
これらのイベントには、検索する必要があるパターンが含まれているか含まれていないファイルタイプがあります。肯定的な結果を別のファイルに保存したいと思います。
私の最初のアプローチは次のとおりです。
find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file
しかし、これはうまくいかないようです。この方法では合わせることができないというのにfind
どうgrep
すればいいですか?
答え1
これは一般的なパターンです:
find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +
ここでは、find
必要なファイルを含むディレクトリ内のすべてのファイルが最初に検索されます。この場合、コマンドは*.txt
次のようになります。.txt
find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +
-exec grep -H 'pattern_to_search' {} +
必要なファイルを見つけたら-H
(パターンが見つかったファイル名を印刷します)を使用して、このファイルから必要なパターンを検索します。ここでは{}
検索したいファイルが含まれていると考えることができます+
。-exec
-exec
grep
grep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt
答え2
別の効果的なアプローチは次のとおりです。
find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"
print0 /オプション-0は、ファイル名文字列にスペースなどの特殊文字が含まれている場合を受け入れます。
答え3
1つのプロセスのみを使用する方法もあります(find
、、-exec
を除くxargs
)。
grep -r "test to search" /directory/containing/files
とにかくGNU grepを使用してください。 :)
ETA:オプションを表示するように求められたので、grep --include
以下はheemaylの例と似ています(「* .txtなどのワイルドカードを使用して.txtで終わるファイルのみを見つけることができます」)。
grep --include '*.txt*' -r "pattern to search" /directory/containing/files
編集するときはい。これは直接代替ではなく代替です。このコマンドは、シンボリックリンクを介して(一般)ファイルを読み込みます。 (しかしシンボリックリンクディレクトリを介して再帰するわけではありません。そうする必要があります-R
。)また、ソケット、名前付きパイプ、およびデバイスファイルも読み込みます(もちろん-D skip
追加またはスキップすることはできますが)。そして、このようなオプションの効果を得る方法はありませんgrep
。必要な場合 - 使用しないと良い選択だと思います。find
-mtime -2
find
grep
答え4
特定のパターンを見つけるためにテキストファイルをgrepし、サブディレクトリを繰り返す必要があるとします。 GNU grepを使うととても簡単です。
cd /to/the/top/level
grep -r "PatternToSearch" *
-r
-R
代わりにまたはを使用できます。--recursive
検索パターンにスペースが含まれている場合は、引用符を使用する必要があります。
GNU grepには多くのオプションがあります。ただ入力grep --help
すると驚くでしょう!