我执行的命令为我提供了目录下文件的相对路径列表。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
这里,打印“quux”,因为它是cat
在内容不包含“bar”的文件上运行的结果。