我想运行命令
find some/path -exec program \{} \;
但是我希望find命令在命令
后立即退出 program \{}
找不到任何文件,失败。
有一种简单的方法吗?
答案 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会通过首先尝试最可能的条件来“优化”查询,这是 - 我猜 - ||
。