我正在使用 find 命令来查看它的行为,我有点迷茫。
第一点很好:
find . -maxdepth 1 -exec grep -l abc {} \;
grep: .: Is a directory
./file2.pdf
./file1
然后我尝试通过链接另一个 egrep 命令来排除 .pdf 文件,但我失败了。
find . -maxdepth 1 -exec grep -l abc {} \; -exec egrep -vl '*.pdf' {} \;
grep: .: Is a directory
./file2.pdf
./file2.pdf
./file1
./file1
为什么它不排除 .pdf 文件并且还打印两次结果?
egrep -vl '*.pdf' some_file
检查文件内容,而不是名称。排除名称的正确方法
find
是否定 (!
) 适当的-name
(或-iname
如果可用)表达式。例子:每个结果都打印了两次,因为在第一次
grep
打印并返回成功后,第二个 (egrep
) 显然没有*.pdf
在相应的文件内容中找到(解释为扩展的正则表达式),因此(注意-v
)打印了相同的名称。注意
-exec
也是一个测试。在您的情况下,如果第一个-exec
报告失败,则-exec
不会触发第二个。如果报告失败,第一个-exec
将报告grep
失败。如果grep
在文件中找不到模式,它将报告失败。这意味着第一个未打印的任何文件都不能grep
由第二个 (egrep
) 打印,因为第二个甚至不会为该文件运行。排除
.pdf
文件的另一种方法是过滤你的第一个输出find
(在你的情况下实际上是grep
s 的输出;你自己find
什么都不打印)。像这样:但是,如果返回的任何路径
find
是多行的(即,如果它包含换行符;Linux 中的文件名可以),那么添加的路径grep
无论如何都会分别感知每一行,就好像这些行引用了多个文件一样;你会得到意想不到的结果。因此,在find
(-name …
) 内进行测试会更好。