这让我发疯,因为我知道这很容易,但我似乎找不到解决方案。啊!我只需要在我的脚本中添加一个 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'
谁能帮忙解释这是为什么?谢谢!
尽管有更好的整体解决方案,但它在此脚本中失败的原因如下:
等待的参数
find
是字符;
。由于;
is (并非偶然)也是shell 的命令结束分隔符,因此必须在 shell 命令中对其进行转义,因此通常键入\;
. 如果现在你把这个字符放在一个变量中,它永远不会被 shell 评估为分隔符。因此,它一定不能逃脱。重现没有变量的错误:
所以只需将字符串替换为:
而不是
find [...] -exec rm
,我建议使用内置功能:从手册:
(顺便说一句,您确实意识到问题中的命令将删除自上次修改以来超过三天的所有文件,是吗?)