我想运行命令
find some/path -exec program \{} \;
但我希望 find 命令在命令执行后立即退出
program \{}
在找到的任何文件上都失败。
有没有一种简单的方法可以做到这一点?
我认为不可能实现你想要的,只有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
组合 with {}
。例如
find some/path | xargs -i program param1 param2 {} param4
除了其他很好的答案之外,GNU find (至少)还有一个-quit
谓词:
find path -other -predicates \( -exec cmd {} \; -o -quit \)
-quit
谓词肯定是非标准的,并且在 BSD 查找中不存在。
您可以将输出从管道find
传输到另一个子进程并使用while
/ break
:
find some/path | while read f
do
program $f
if [ $? -ne 0 ]
then
break
fi
done
这是我的“构建系统”示例,它在遇到第一个编译器错误后停止(基于 Kojiro 的回答,这对我来说并不适用):
(对转义括号的需求是真实的。我知道这很痛苦。)
find -name '*.cpp' \( -print -a -exec g++ -c {} \; -o -quit \)
我想为位于当前目录及以下目录中的所有 C++ 文件构建一个静态库。
在运行编译器之前,我想要文件-print
-ed,然后-exec
-ed,但是当它失败时(并且stderr
在-quit
.
-a
is like &&
and -o
is like ||
in shell 或 C.
没有括号,GNU find 通过首先尝试最可能的条件来“优化”查询,这就是 - 我猜 - -quit
。
% _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}\" "{}" +