如果-exec失败则中断查找


14

有没有一种方法可以写成find这样,如果-exec对文件进行的一项操作失败,它就会中断?

例如(javac方便地用作可以在某些文件上返回退出代码1且没有其他原因的程序):

$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
       ^
1 error

在上面的示例中,尽管exec文件上的A.java失败(并返回了退出代码1),但该find命令也继续执行并编译了文件B.java。有没有一种突破的方法,find或者我应该使用某种形式的for替代方法吗?

我的find版本:

$ find -version  | head -1
find (GNU findutils) 4.4.2

Answers:


5

我认为...

find ... -exec sh -c 'cmd "$0" || kill $PPID' \{\} \;

...应该几乎可以做到这一点find


谢谢@吉尔斯。怎么$0办?
mikeserv 2014年

1
$0sh -c$1是第二个参数,等等)的第一个参数—通常是正在执行的程序的名称,但是在这里,您正在执行一个代码段,并传递正在处理的文件名是$0有道理的(例如,您很容易看到它ps)。有一种思想流派(我显然不属于这条流派)指出$0应该始终是可执行的,而您应该编写sh -c 'cmd "$1" …' sh {}此类思想。
吉尔斯(Gillles)“所以-别再作恶了”

@Gilles-非常漂亮。非常感谢。我在去学前班的路上在车上弄清楚了,但是我不得不考虑几分钟。那很聪明-我要用它。我真正点击它的是一次编辑,我记得在您自己的一篇帖子中读到Stephane的文章时,他find-sh $0find声明的末尾添加了a 。在我看来,这似乎更有用,尽管从长远来看,我认为这是最重要的。
mikeserv

不适用于上述情况。find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;文件A.java失败后,仍然可以编译文件B.java。
Marcus Junius Brutus 2014年

@MarcusJuniusBrutus-我修复了它。我应该早点看过你的评论。再次抱歉。
mikeserv

4

至少使用GNU find可以使用:

find ... -exec ... -o -quit

我似乎很难弄清楚exec在哪里停止-o开始。无论find . -iname \*.java -exec javac {} -o -quit \;find . -iname \*.java -exec javac {} \; -o -quit \;失败(以不同的方式)
马库斯Junius罗马政治家

@ \;的@和-exec-o -quit在这种情况下之前)需要@MarcusJuniusBrutus ,但在其他地方可能不需要@MarcusJuniusBrutus 。
Hauke Laging

2
使用-exec ... -o -quit对我不起作用。它不处理任何文件。但是,这行有效:如果为false,则调用find . -iname \*.java -not -exec javac '{}' \; -quit:,即。返回非零值。-quit-exec
savanto 2014年

find . -iname \*.java -exec javac {} \; -o -quit,也无法处理任何文件。奇怪的是,find . -iname \* -exec echo 'foo' \; -o -quit “处理”的文件。
Marcus Junius Brutus

0

请查阅您的find手册。@Hauke的答案促使我去寻找,而QNX的发现有一个-abort选项似乎与GNU -quit选项相似。只要我使用\(\)对表达式进行分组,它就对我有效:

find . -mtime -4 -name <pattern> \( -exec my_cmd {} \; -o  -abort \) 

注意:如果没有括号,它将在第一个文件上中止。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.