在 bash 脚本中使用 find 和 -exec rm 失败,但在提示符下可以工作

在 bash 脚本中使用 find 和 -exec rm 失败,但在提示符下可以工作

这让我发疯,因为我知道这很容易,但我似乎找不到解决方案。啊啊!我只需要在我的脚本中添加一个 find 命令,以便它在运行新备份之前删除旧文件。我宁愿通过变量来控制它,而不是输入确切的命令。如果我在脚本中输入该命令而不是使用变量,该命令将在脚本中起作用。

FIND="/usr/bin/find"
BUILD="~/"
FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
echo $find $BUILD $FINDOPTS
## remove the 2 week old backup
echo "Removing old backups... "
$FIND $BUILD $FINDOPTS

如果我只是回显该$FIND $BUILD $FINDOPTS命令,它就会像我键入该命令时一样显示。唯一的区别是当我键入它时它实际上会运行。

打字/usr/bin/find ~/ -type f -mtime +3 -exec rm -rf {} \;效果很好。

我得到的错误是:

/usr/bin/find: missing argument to `-exec'

谁能帮忙解释一下这是为什么吗?谢谢你!

答案1

尽管有更好的整体解决方案,但该脚本失败的原因如下:

FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
                                            ^

等待的参数find是字符;。因为;是(并非偶然)shell 的命令结束分隔符,它必须在 shell 命令中转义,因此通常键入\;。如果现在将此字符放入变量中,则 shell 永远不会将其评估为分隔符。因此它不可以被逃脱。

在没有变量的情况下重现错误:

$ find /etc -exec ls "\;"
find: missing argument to `-exec'

因此只需将字符串替换为:

FINDOPTS="-type f -mtime +3 -exec rm -rf {} ;"

答案2

find [...] -exec rm我建议使用内置功能,而不是使用:

find [...] -delete

从手册中:

 -delete
         Delete found files and/or directories.  Always returns true.  This executes 
         from the current working directory as find recurses down the tree.  It will 
         not attempt to delete a filename with a ``/'' character in its pathname 
         relative to ``.'' for security reasons.  Depth-first traversal processing 
         is implied by this option.  Following symlinks is incompatible with this 
         option.

(顺便说一句,您确实意识到问题中的命令将删除任何自上次修改以来超过三天的文件,是吗?)

相关内容