まず最初に…これはあなたが考え、望んでいることをしますか?
find -iname '/abc/*.txt'
サブディレクトリ内のファイルが見つかりません (Mac OS X 10.8.5 の場合)。wherefind . -iname '*.txt'
はいくつかのファイルを検索find . -iname '/path/*.txt
し、出力を生成せず、どちらも生成しません-ipath
。ただし、find . -ipath '*/path/*.txt'
ファイルのリストは生成されます。したがって、当面の間、find
コマンドを次のように修正します。
find . -ipath '*/abc/*.txt'
次に、次を実行します。
xargs grep -e "ERROR1" -e "ERROR2"
これにより、ファイルの名前とメッセージの両方を含む行が生成されます。一致するファイルの名前が必要な場合は-l
、コマンドに次を追加する必要があります。
find . -ipath '*/abc/*.txt' |
xargs grep -l -e "ERROR1" -e "ERROR2"
ただし、一致しないファイルのみを一覧表示する必要があります。そのために、 GNU をお持ちの場合は、次のオプションgrep
を使用できます。-L
find . -ipath '*/abc/*.txt' |
xargs grep -L -e "ERROR1" -e "ERROR2"
GNU を持っていない場合はgrep
、さらに多くの作業を行う必要があります。
find . -ipath '*/abc/*.txt' |
tee file.names |
xargs grep -l -e "ERROR1" -e "ERROR2" > matching.file.names
comm -23 file.names matching.file.names
このtee
コマンドは、ファイル内のファイル名のリストのコピーをキャプチャしますfile.names
(そのような独自性)。このgrep
コマンドは、一致するファイル名のリストを にキャプチャしますmatching.file.names
。名前は、両方のファイルで同じ順序になります。に表示されるが表示されfile.names
ないmatching.file.names
ものは、必要なものです。デフォルトでは、comm file.names matching.file.names
コマンドは 3 つの列を出力します。最初のファイルでのみ見つかった行、2 番目のファイルでのみ見つかった行、および両方のファイルで見つかった行です。オプションを使用して列 2 と 3 の出力を抑制することにより-23
、他のファイルには見つからない最初のファイルの名前のみが取得されます。これが必要なリストです。
どこからリストを取得するかはあなた次第です…</p>