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

时间:2013-02-14 09:05:14

标签: bash find exec exit

我想运行命令

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

但是我希望find命令在命令

后立即退出
 program \{}
找不到任何文件,

失败。

有一种简单的方法吗?

5 个答案:

答案 0 :(得分:5)

我认为只有find -exec才能达到你想要的效果。

最接近的替代方法是将管道find发送到xargs,如下所示:

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{}结合使用。 E.g。

find some/path | xargs -i program param1 param2 {} param4

答案 1 :(得分:5)

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

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

-quit谓词为certainly non-standard,在BSD查找中不存在。

答案 2 :(得分:1)

您可以将find的输出传输到另一个子流程并使用while / break

find some/path | while read f
do
    program $f
    if [ $? -ne 0 ]
    then
        break
    fi
done

答案 3 :(得分: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}\" "{}" +

答案 4 :(得分:0)

这是我的“构建系统”的示例,它在遇到第一个编译器错误后停止 (根据小次郎的回答,这对我来说并不适合):

(逃脱括号的必要性是真实的。我知道这很痛。)

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

我想构建一个基本上所有C ++文件的静态库,这些文件位于当前目录及下面。

在运行编译器之前,我希望文件-print - ed,然后是-exec - ed,但是当它失败时(并在stderr上留下错误,它应该{{1} }}

-quit-a类似,而&&与{C}中的-o类似。

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