我有一个脚本可以删除超过 N 分钟的文件。该脚本基本上运行:
find /some-folder/* -mmin +59 | xargs rm -rf
但由于某种原因,它打印了大量: No such file or directory
但似乎可以完成工作,例如请参见下面的示例:
$ du -hs /opt/storage/
5.2G /opt/storage/
$ find /opt/storage/* -mmin +59 | xargs rm -rf
find: /opt/storage/caches/modules-2/files-2.1/org.jboss/jboss-parent: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/redis.clients: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/org.infinispan: No such file or directory
...
$ du -hs /opt/storage/
4.0K /opt/storage/
find
对于导致xargs
查找不存在的文件的原因有什么想法吗?也许存在某种竞争条件,文件在被发现/打印到日志之前被以某种方式删除?
但提到解决方案是使用xargs
我正在做的事情。
更新:根据下面的评论,问题似乎是删除文件会更新父文件夹的修改时间。此外,在删除过程中,可能会在同一父/起始文件夹下创建文件和文件夹。
这篇文章中有一个例子: https://stackoverflow.com/a/13869000/363603
使用ctime
代替。但来自:
https://www.webservertalk.com/linux-touch-command
更改时间 文件的元数据、属性或内容上次更改的时间。
这样就会产生同样的问题。
如果可以find
与结合使用--time=birth
:
https://unix.stackexchange.com/a/567590/11740
这可能是最强大的解决方案,但到目前为止我还没有找到这方面的例子。
因此,Linux 中没有“标准”方法可以从起始文件夹递归地执行文件保留(基于日期阈值),而子树的某些部分可能会在删除/保留期间更新?
目前的解决方案: 根据到目前为止的发现,我已分为查找所有要删除的文件,然后执行删除:
# Store path to all files that should be deleted (potentially a lot!)
FILES_TO_DELETE=$(find /some-folder/* -mmin +59)
# Delete the file
rm -rf $FILES_TO_DELETE
答案1
您正在删除目录及其内容,然后删除这些不再存在的内容,因此会出现错误消息。
根据修改时间删除目录可能不是一个好主意,因此您可能宁愿采用两步方法:
- 删除文件
- 删除空目录
-->
find /some-folder/* -type f -mmin +59 -delete \
&& find /some-folder/* -type d -empty -delete
如果您确实想删除文件和目录,可以使用-prune
不下降到已删除的目录:
find /some-folder/* -mmin +59 -exec rm -rf {} \; -type d -prune
请注意,我使用-delete
(仅适用于文件)或-exec rm -rf {} \;
代替xargs ...
.如果您想使用,您应该选择使用和xargs
来进行空分隔输出。其中一些选项在您的版本中可能不可用。-print0
xargs -0
find