如果在其中一个文件上失败,如何退出find -exec

FOR*_*RAN 16 bash exec find exit

我想运行命令

find some/path -exec program \{} \; 
Run Code Online (Sandbox Code Playgroud)

但我希望find命令尽快退出命令

 program \{}
Run Code Online (Sandbox Code Playgroud)

找不到任何文件失败.

有一个简单的方法吗?

use*_*001 5

我认为仅凭即可无法实现您想要的find -exec

最接近的替代方法是对进行管道find传输xargs,例如:

find some/path -print0 | xargs -0 program
Run Code Online (Sandbox Code Playgroud)

要么

find some/path -print0 | xargs -0L1 program
Run Code Online (Sandbox Code Playgroud)

如果程序以非零退出状态终止,则退出

  • print0使用,使文件在其名称中的换行符可以处理
  • -0-print0使用时是必要的
  • L1讲述xargs在时间程序一个参数执行程序(默认是添加的所有参数在程序的单个执行)

如果只有健全的文件名,则可以这样简化:

find some/path | xargs program
Run Code Online (Sandbox Code Playgroud)

要么

find some/path | xargs -L1 program
Run Code Online (Sandbox Code Playgroud)

最后,如果程序采用多个参数,则可以-i与结合使用{}。例如

find some/path | xargs -i program param1 param2 {} param4
Run Code Online (Sandbox Code Playgroud)


koj*_*iro 5

除了其他好的答案,GNU find(至少)有一个-quit谓词:

find path -other -predicates \( -exec cmd {} \; -o -quit \)
Run Code Online (Sandbox Code Playgroud)

-quit谓词是肯定非标和在BSD中发现不存在.

  • 这接近我的需要,但如果失败(谓词的第二部分),我需要以非零退出状态退出. (3认同)

Eug*_*ash 1

您可以将输出通过find管道传输到另一个子进程并使用while/ break

find some/path | while read f
do
    program $f
    if [ $? -ne 0 ]
    then
        break
    fi
done
Run Code Online (Sandbox Code Playgroud)

  • 最好只做“if”!程序$f;然后打破……`。您还可以使用“-print0”跨 NUL 分隔而不是换行并读取“-d”,这样更安全。 (2认同)
  • 此变体应用了 @kojiro 的安全建议,如果文件包含空格,这些建议很重要。为此,您还需要在“$f”周围加上引号。(注意它使用 bash 特定的 `$''`)。它也更小:`find path -print0 | 同时读取 -d $'\0' f; 执行命令“$f”|| 休息; 完成` (2认同)