ファイルの内容に基づいてリストからファイルパスを除外する

ファイルの内容に基づいてリストからファイルパスを除外する

私が実行したコマンドは、ディレクトリの下のファイルへの相対パスのリストを提供します。find my_dirコマンド自体は異なりますが、使用法の面で考えてみてください。

リスト内の各ファイルについて、ファイル自体の内容に基づいてリストをフィルタリングするコマンドにパイプしたいと思います。同じまたは類似のセマンティクスを探しているが、egrep -vパス自体ではなくファイルの内容に対して正規表現を実行するには、ファイルを開いて読み取る必要があります。

単純なパイプコマンドフローを使用してこれを行うにはどうすればよいですか?例:

find some_dir/ | egrep_contents -v 'Exclude pattern' | xargs -n1 do_something_with_filtered_files

この場合、egrep_contents理想的にはこの質問で要求されたコマンドになります。一致するものが見つかるまで、ファイルの各行で指定された除外パターンを実行します。一致するものが見つかると、ファイルパスは次のパイプラインコマンドに渡されません。

状況に応じて、Windows用のGit(MINGW)に付属のGit Bashでこれらのコマンドを実行しています。

答え1

このgrepオプションはあなたが探しているもの--files-without-matchかもしれません。-Lそのファイルの内容が指定されたパターンと一致しないファイルパスを印刷するようにgrepに指示します。例えば、

$ echo "bar" > foo
$ echo "quux" > baz

$ ls
baz foo

$ find . -type f | xargs -n1 grep -EL bar | xargs -n1 cat
quux

catここで、「quux」は、内容に「bar」が含まれていないファイルで実行した結果であるため、印刷されます。

関連情報