我的任务是递归删除所有超过 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
-f
find
-print
find
是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
文件名解析:find
rm
find /dir/prd/log -mtime +90 -exec rm -f '{}' +
除了更加便携和可靠之外,它还避免了从上述输出rm
中读取提示答案的问题(如果没有找到文件,它也可以完全避免运行)。find
rm
如果/dir/prod/log
包含子目录,您需要过滤它们以避免错误消息,因为rm
无法删除它们:
find /dir/prd/log ! -type d -mtime +90 -exec rm -f '{}' +