在“find ... | xargs ...”中,为什么即使 find 返回零结果,xargs 也会进行迭代?

在“find ... | xargs ...”中,为什么即使 find 返回零结果,xargs 也会进行迭代?

最近我遇到了一个令我惊讶的用例。该问题涉及不返回任何匹配项find ... | xargs ...的情况。find

在两个系统上进行测试后,我发现其中一个系统的行为符合我的预期:

$ mkdir empty
$ find empty -type f | wc -l
       0
$ find empty -type f | xargs echo file
$ 

但另一个的行为并不像我预期的那样:

$ mkdir empty
$ find empty -type f | wc -l
0
$ find empty -type f | xargs echo file
file

是什么导致了第二种情况下的行为?有办法解决吗?当find返回零个匹配项时,我想xargs迭代零次。

答案1

这就是 GNU 版本中 -r 的用途:

-r, --no-run-if-empty
If the standard input does not contain any nonblanks, do not run the command.  
Normally, the command is run once even if there is no input.  This option is a GNU extension.

在 FreeBSD 上这是默认行为。

相关内容