20

我想运行命令

find some/path -exec program \{} \; 

但我希望 find 命令在命令执行后立即退出

 program \{}

在找到的任何文件上都失败。

有没有一种简单的方法可以做到这一点?

4

5 回答 5

11

我认为不可能实现你想要的,只有find -exec.

最接近的替代方法是对 进行管道findxargs如下所示:

find some/path -print0 | xargs -0 program

或者

find some/path -print0 | xargs -0L1 program

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

  • print0用于处理名称中带有换行符的文件
  • -0-print0使用时需要
  • L1告诉xargs程序一次用一个参数执行程序(默认是在一次程序执行中添加所有参数)

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

find some/path | xargs program

或者

find some/path | xargs -L1 program

最后,如果程序需要多个参数,您可以使用-i组合 with {}。例如

find some/path | xargs -i program param1 param2 {} param4
于 2013-02-14T09:49:12.247 回答
7

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

find path -other -predicates \( -exec cmd {} \; -o -quit \)

-quit谓词肯定是非标准的,并且在 BSD 查找中不存在。

于 2013-02-14T12:24:00.627 回答
1

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

find some/path | while read f
do
    program $f
    if [ $? -ne 0 ]
    then
        break
    fi
done
于 2013-02-14T09:36:05.127 回答
1

这是我的“构建系统”示例,它在遇到第一个编译器错误后停止(基于 Kojiro 的回答,这对我来说并不适用):

(对转义括号的需求是真实的。我知道这很痛苦。)

find -name '*.cpp' \( -print -a -exec g++ -c {} \; -o -quit \)

我想为位于当前目录及以下目录中的所有 C++ 文件构建一个静态库。

在运行编译器之前,我想要文件-print-ed,然后-exec-ed,但是当它失败时(并且stderr-quit.

-ais like &&and -ois like ||in shell 或 C.

没有括号,GNU find 通过首先尝试最可能的条件来“优化”查询,这就是 - 我猜 - -quit

于 2014-03-05T10:04:07.967 回答
0
% _find_trap() {
>   _find_pid="${1}" ; _find_ops="${2}" ; _find_trigger="${3}"
>   shift 3 && set -- "${@}" 
>   trap 'kill -s INT "-${_find_pid}" \
>     unset _find_pid _find_ops _find_trigger ; set - \
>     1>&2 printf "%s" "find killed due to trap" \
>     exit [CODE] ' TRAP
>  while { sh -c "${_find_ops} ${@}"} {
>    [ "${_find_trigger}" ] && { kill -s TRAP "-${_find_pid}" ; break ; }
>    ...
>  }
> export -f _find_trap ; find . -execdir _find_trap \"$$\" \"${cmds}\" \
>   \"${testable_trigger}\" "{}" +
于 2013-12-07T21:46:31.697 回答