一般来说,如果我们想执行一个命令,如果find
识别出符合某些规格的文件,我们可以使用-exec
.但就我而言,如果find
找到匹配项,我想退出 shell/脚本,但-exec
不能这样做。 [显然find
是-exec
也不能调用 bash 函数.)
例如,在删除树的脚本中,当且仅当它仅包含空目录时,我想首先检查是否存在任何非目录,并在第一个此类意外条目时中止并显示错误消息。
到目前为止,每当我需要做这样的事情时,我都会将输出放入一个变量(可能使用-quit
with find
)并测试它是否为空。
所以我的脚本看起来像:
#! /bin/sh
INTRUDER="$(find "$@" ! -type d -print -quit)"
if [ -n "$INTRUDER" ] ; then
echo "Found non-dir $INTRUDER; leaving the arguments untouched"
exit 1
fi
rm -R "$@"
还有比这不同/更好的方法吗?我所说的“更好”是指,代码更小,更可移植(如果上述存在任何可移植性问题)等。我所说的“不同”是指避免额外的变量并测试其长度。
答案1
这对我有用:
find "$@" ! -type d -exec kill -9 $$ \; -quit && rm -R "$@"
- 如果
find
正常退出(没有发现任何东西)rm -R "$@"
就会执行。 - 如果
find
发现某些内容,当前 shell/脚本将被终止($$
存储 pid)。在这种情况下, -部分rm
将永远不会被执行。