Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在find-exec中使用参数执行命令的正确语法_Linux_Bash - Fatal编程技术网

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
+
的顺序进行质疑,但这是一个质疑,不是一个严重的问题。你应该多一点自信。