使用 xargs 删除文件会打印大量 No such file or directory (但似乎有效...)

使用 xargs 删除文件会打印大量 No such file or directory (但似乎有效...)

我有一个脚本可以删除超过 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查找不存在的文件的原因有什么想法吗?也许存在某种竞争条件,文件在被发现/打印到日志之前被以某种方式删除?

可能相关: https://www.linuxquestions.org/questions/linux-newbie-8/find-exec-with-rm-gives-unnecessary-error-747473/#post3646393

但提到解决方案是使用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

您正在删除目录及其内容,然后删除这些不再存在的内容,因此会出现错误消息。


根据修改时间删除目录可能不是一个好主意,因此您可能宁愿采用两步方法:

  1. 删除文件
  2. 删除空目录

-->

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来进行空分隔输出。其中一些选项在您的版本中可能不可用。-print0xargs -0find

相关内容