rm 中加 -f 和 find 中加 -print 后结果和效果有什么区别?

rm 中加 -f 和 find 中加 -print 后结果和效果有什么区别?

我的任务是递归删除所有超过 90 天的文件,/dir/prd/log即也从子目录中删除。我做了这个命令:

find /dir/prd/log* -mtime +90 | xargs rm

然后我和一个 Unix 人聊天,他建议

find /dir/prd/log* -mtime +90 -print | xargs rm -f

我只是想知道他将“-print”和“-f”放在命令中的目的是什么。

答案1

-f告诉rm永远不要提示(例如当它遇到只读文件时)并忽略丢失的文件,要求删除(而不是指示错误)。如果没有传递任何要删除的文件,它也不会抱怨。

在这里,根据xargs实现的标准输入将是来自或 的rm管道,因此如果没有, find 可能最终会从!的输出中读取这些提示的答案。find/dev/null-ffind

-printfind是Linux 发行版中的默认操作符合 POSIX 标准的系统,但可能需要明确指定在非常古老的 Unix 或类 Unix 系统上

因此他的目的可能是让命令更加健壮和可移植。您可以使用以下变体做得更好find(超越 POSIX):

find /dir/prd/log -mtime +90 -print0 | xargs -0 rm -f

避免包含“特殊”字符(包括空格、换行符、制表符、单引号、双引号、反斜杠)的文件名出现问题,如果您find支持该-delete操作,

find /dir/prd/log -mtime +90 -delete

避免产生其他进程来执行删除(并且还避免了一些竞争条件问题)。 (请注意,我/dir/prd/log在此处指定是为了符合您问题第一句中所述的要求,正如评论中所确认的那样。)

使用 POSIX find,您仍然可以通过要求运行自身来避免xargs文件名解析:findrm

find /dir/prd/log -mtime +90 -exec rm -f '{}' +

除了更加便携和可靠之外,它还避免了从上述输出rm中读取提示答案的问题(如果没有找到文件,它也可以完全避免运行)。findrm

如果/dir/prod/log包含子目录,您需要过滤它们以避免错误消息,因为rm无法删除它们:

find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +

相关内容