私は約500個の文字列を持っていて、その文字列を含むファイルをディレクトリから検索し、この文字列を含むファイル名を取得したいと思います。これまで私は次のものを使用しました。
find -name 'LYFNRE.*' -exec grep -f file1.txt {} \; -print
しかし、問題は、1つの文字列が複数のファイルで見つかる可能性があるため、出力が大きいため、どの文字列があり、どの文字列が欠落しているかを見つけるのが難しいということです。文字列を印刷してそのファイル名を見つけるのに役立ちますか?
答え1
grep
ファイル名だけを教えてください。 GNUはgrep
これを行うことができます:
grep -HFf ../strings.txt *
これにより、次の出力が提供されます。
[filename]:[matched_line]
...ディレクトリ内のすべてのファイルのすべてのエントリ。次のように行番号を取得することもできます。
grep -HnFf ../strings.txt *
...これは...
[filename]:[line_number]:[matched_line]
答え2
問題は、一度に1つのファイルを渡すことですgrep
。grep
コマンドラインに単一のファイルが表示された場合は、検索する場所を正確に知っていると想定されるため、一致の前にファイル名が表示されません。
ファイル名を常に出力する1つの方法grep
はパスすることです/dev/null
(一致するものはまったくありません)。一部のgrep実装には次のオプションがあります-H
。
また、一度に複数のファイルを実行する-exec … {} +
代わりにプログラムを使用できます。-exec … {} \;
これはより速いです。渡す必要があります。または、一致するファイルが1つしかない場合、または複数の呼び出しが/dev/null
必要な一致が多く、そのうちの1つが単一のファイルに関連付けられているため、コマンドが1つのファイルでのみ呼び出される場合があります。-H
grep
find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +
GNU grepと最新のBSD実装(OSXを含む)grep
はfind
。
grep -R --include='LYFNRE.*' -f file1.txt -H .
または、シェルで再帰ワイルドカードを実行できます。 zshではすぐに使用できます。 Bashでは最初に実行する必要がありshopt -s globstar
、bashはディレクトリへのシンボリックリンク(find
またはzshとは異なり)を介して繰り返されることに注意してください。
grep -f file1.txt /dev/null **/LYFNRE.*
答え3
egrepを使用してください:
egrep -n "str1|str2|str3" file_names
-nは、文字列が見つかった特定のファイルの行番号を印刷します。