Linux 在find-exec中使用参数执行命令的正确语法
我在一个脚本中有这一行,该脚本本应删除旧备份,但它会抛出一个错误,即目标是目录:Linux 在find-exec中使用参数执行命令的正确语法,linux,bash,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 该命令的正确语法是什
find $BACKUP_DIR* -mtime $RETENTION -exec rm {} \; >> $MSG 2>&1
因此,我试图将-rf添加到rm命令中,但它仍然不起作用[没有错误!]
find $BACKUP_DIR* -mtime $RETENTION -exec "rm -rf" {} \; >> $MSG 2>&1
该命令的正确语法是什么?我试过双引号,单引号和反勾号。。。我一定要逃出射频吗 我通常更喜欢-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:)
回答你的问题:不,你不必逃避命令选项。如果它不起作用,您的问题就在其他地方,很可能在startdir&search模式中。尝试不使用输出重定向并使用-print或-ok进行调试。我通常更喜欢-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:)
回答你的问题:不,你不必逃避命令选项。如果它不起作用,您的问题就在其他地方,很可能在startdir&search模式中。尝试不使用输出重定向并使用-print或-ok进行调试。将其更改为:-exec rm-rf{}@michael501你可以把它贴出来作为答案。这是我第一次尝试的。我假设它不起作用,因为它看起来像是find命令的参数。@SeanKimball为什么说它不起作用?您会收到什么错误消息?问题是试图引用“rm-rf”,这会导致shell将其作为单个令牌传递给
find-exec
,该令牌被解释为命令名,请删除引号,-exec
之后的令牌被解释为实用程序
,后跟参数
,shell没有进一步的扩展或解释。将其更改为:-exec rm-rf{}\@michael501你可以把它贴出来作为答案。这是我第一次尝试的。我假设它不起作用,因为它看起来像是find命令的参数。@SeanKimball为什么说它不起作用?您会收到什么错误消息?问题是试图引用“rm-rf”,这会导致shell将其作为单个令牌传递给find-exec
,该令牌被解释为命令名,请删除引号,-exec
之后的令牌被解释为实用程序
,后跟参数
,shell没有进一步的扩展或解释。请注意,POSIX支持+
符号,这通常会使GNU-print0
和-0
扩展到find
和xargs
不必要。我很好奇:你为什么要让你的答案成为社区wiki?@JonathanLeffler我通常这样做,所以人们可以改进它。有些人甚至拒绝投票(出于其他原因)非维基答案。而且,我在这方面不仅有积极的经验:)人们可以通过编辑或建议改进非维基答案。你的回答很好;我会对-print0
与+
的顺序进行质疑,但这是一个质疑,不是一个严重的问题。你应该更自信一点。注意POSIX支持+
符号,这通常会使GNU-print0
和-0
扩展到find
和xargs
不必要。我很好奇:你为什么要让你的答案成为社区wiki?@JonathanLeffler我通常这样做,所以人们可以改进它。有些人甚至拒绝投票(出于其他原因)非维基答案。而且,我在这方面不仅有积极的经验:)人们可以通过编辑或建议改进非维基答案。你的回答很好;我会对-print0
与+
的顺序进行质疑,但这是一个质疑,不是一个严重的问题。你应该多一点自信。