如果 find 找到某些文件,如何执行内置 shell

如果 find 找到某些文件,如何执行内置 shell

一般来说,如果我们想执行一个命令,如果find识别出符合某些规格的文件,我们可以使用-exec.但就我而言,如果find找到匹配项,我想退出 shell/脚本,但-exec不能这样做。 [显然find-exec 也不能调用 bash 函数.)

例如,在删除树的脚本中,当且仅当它仅包含空目录时,我想首先检查是否存在任何非目录,并在第一个此类意外条目时中止并显示错误消息。

到目前为止,每当我需要做这样的事情时,我都会将输出放入一个变量(可能使用-quitwith 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将永远不会被执行。

相关内容