ファイル名 (およびそれらへのフル パス) を含むファイルがあり、それらすべての中から単語を検索したいと考えています。説明する擬似コード:
grep keyword <all files specified in files.txt>
また
cat files.txt > grep keyword
cat files txt | grep keyword
問題は、実際のファイルの内容ではなく、ファイル名を検索するために grep しか取得できないことです。
cat files.txt | xargs grep keyword
また
grep keyword `cat files.txt`
または(前と同等だが読み違えにくい)
grep keyword $(cat files.txt)
トリックを行う必要があります。
落とし穴:
files.txt にスペースを含むファイル名が含まれている場合、「This is a filename.txt」は「This」、「is」、「a」、および「filename.txt」の 4 つのファイルとして解釈されるため、どちらのソリューションも誤動作します。ファイル名にスペースを入れてはいけないという正当な理由があります。
2 番目の (cat) バージョンでは、コマンド ラインが非常に長くなる可能性があります (環境の制限を超えると失敗する可能性があります)。最初の (xargs) バージョンは長い入力を自動的に処理します。xargs には、詳細を制御するためのオプションがいくつか用意されています。
tr '\n' '\0' <files.txt | LANG=C xargs -r0 grep -F keyword
DevSolar からの両方の回答 (Linux Ubuntu でテスト済み) が機能しますが、コマンド ラインの長さの制限に達するのを回避できるため、多くのファイルがある場合は xargs バージョンが推奨されます。
それで:
cat files.txt | xargs grep keyword
行く方法です
最後に bash シェル スクリプトを作成してから長い時間が経ちましたが、最初の grep (すべてのファイル名を検索したもの) の結果を配列に格納し、それを反復処理して、さらに grep コマンドを発行することができます。
適切な出発点は、bash スクリプト ガイドです。