在find -exec中使用参数执行命令的正确语法

时间:2014-11-07 22:00:47

标签: linux bash

我在一个应该修剪旧备份的脚本中有这一行,除了它抛出目标是目录的错误:

find $BACKUP_DIR* -mtime $RETENTION -exec rm {} \;  >> $MSG 2>&1

所以我试图将-rf添加到rm命令中,但它仍然无效[没有错误!]

find $BACKUP_DIR* -mtime $RETENTION -exec "rm -rf" {} \;  >> $MSG 2>&1

该命令的正确语法是什么?我尝试过双引号,单引号和反引号......我是否必须以某种方式逃避-rf?

1 个答案:

答案 0 :(得分:4)

我通常更喜欢-0 xargs方法:

find ... -print0 | xargs -0r rm -rf

但这只适用于带有一个或多个参数直到行尾的命令。但它是非常安全的,因为它在文件名中包含任何二进制垃圾并将其表示为分离良好的参数。它还避免了必须记住这个{}语法。它还减少了儿童执行的次数。 GNU变体中需要-r选项,以确保在未找到匹配项时不调用该命令。对于FreeBSD,它被忽略(因为它是默认值)。

在你的情况下,GNU find还有一个-delete动作:

find ... -delete

如果你坚持使用转义法,那么它将是:

find ... -exec /bin/rm -rf "{}" \;

或者如果使用GNU find,您可以更高效地使用:

find ... -exec /bin/rm -rf "{}" +

只是为了确定,使用-ok:)

touch test1 test2 test3
find . -type f -ok rm -rf "{}" +
"rm -rf ./test1 ./test2 ./test3"? y

并回答你的问题:不,你不必逃避命令选项。如果它不起作用,你的问题就在其他地方,必须在startdir&搜索模式。尝试不使用输出重定向并使用-print或-ok进行调试。