exec not working after using “find … -exec grep -L”
我可以使用这样的执行链:
1
| find -name 'file' -exec grep -l 'content' '{}' \; -exec cp '{}' '{}'_copy \; |
但是使用grep -L选项(对于不匹配的文件为L),则不执行第二个exec。 为什么呢
1
| find -name 'file' -exec grep -L 'conXent' '{}' \; -exec cp '{}' '{}'_copy \; |
这两个命令都检索相同的文件。 但是" exec cp"仅适用于grep -l。
谢谢你的帮助!
-
所以您想对所有不包含conXent的文件执行操作?
-
是。但是,为什么不能与grep -L一起使用呢?使用exec cp之前的输出是相同的
-
哦!它用+代替; ,如下所示:查找-name文件-exec grep -L conXent {} + -exec cp {} {} _copy ;但为什么 ?
-
从man find-> -exec command ; ---> The specified command is run once for each matched file.但是仍然不清楚,您要复制所有文件还是仅复制通过-L匹配的文件?
-
我想复制所有文件而没有内容,因此所有输出的文件都是find grep -L。请参阅我之前的评论,它与+一起使用。
-
这有点棘手且不安全。我会选择类似find -type f -exec sh -c f={}; if [ -n"$(grep -L 3 $f)" ]; then cp $f ${f}_copy; fi {} \;的东西。
-
谢谢...虐待尝试理解您的命令,因为+在cp上有效,但在sed上却无效:
-
有人可以解释一下您如何在" grep -L"之后使用sed吗?
-
不要将{}直接扩展到脚本块中。而是将其作为参数传递给脚本。
-
我不懂伊坦。一个简单的例子?
-
请参阅我的答案,以了解您的find命令出错的地方。您在这里不需要-exec sh解决方案。
-
使用+代替 ;,最后也可以使用sed:查找-name文件-exec grep -L conXent {} + -exec sed -i s / foo / bar / g {} ; (别忘了-i!)
问题是由于某种原因,grep -L正在以返回码1退出。 我无法解释为什么这样做。 我的理解是不应该这样做,因为正在输出行。
在任何情况下,退出状态都会导致-exec评估为false并导致find停止处理文件(与其他任何失败的测试相同)。
对于+不会发生这种情况,因为当find一次给grep多个文件时,至少一个与这些内容匹配,因此grep退出时返回的代码为零(但这显然不可靠)。 我也无法解释这种行为,这似乎对我也完全是倒退。
我相信使用-not -exec grep -L ... \;可以满足您的要求,但是我不得不再想一想。
嗯...我想返回码很有意义,因为当输出文件名时找不到匹配的行,而当文件名没有输出时找到匹配的行。
-
我也从grep -L的1返回代码中绊了一下。 很奇怪,不是吗? 这就是为什么我最终考虑使用-exec sh -c并在那里采取相应行动的原因。 很好的解释!
-
@fedorqui即使它使我对于grep返回码意味着什么的模型变得复杂,它的确有意义。 没有参数/ -l,-l和-v的工作方式在返回码方面要比假定的Id要复杂一些。