我可以像这样使用exec链:
find -name 'file' -exec grep -l 'content' '{}' \; -exec cp '{}' '{}'_copy \;
但是使用grep -L选项(L表示没有匹配的文件),第二个exec不会被执行。为什么?
find -name 'file' -exec grep -L 'conXent' '{}' \; -exec cp '{}' '{}'_copy \;
两个命令都检索相同的文件。但是" exec cp"仅适用于grep -l。
感谢您的帮助!
答案 0 :(得分:3)
问题在于grep -L
由于某种原因退出时返回代码为1
。我无法解释为什么它会这样做。我的理解是它不应该这样做,因为正在输出行。
在任何情况下,退出状态都会导致-exec
评估为false
并导致find
停止处理文件(与任何其他失败测试相同)。
+
不会发生这种情况,因为当find
同时给出grep
个多个文件时,至少有一个文件与这些内容匹配,因此grep
退出时为零返回代码(但这里显然不可靠)。我也无法解释这种行为,这似乎也完全倒退了。
我相信使用-not -exec grep -L ... \;
会做你想做的事情,但我必须考虑更多,以确保。
嗯...我认为返回代码是有意义的,因为当输出文件名时没有找到匹配的行,当没有输出文件名时,找到匹配的行。