寻找 。 - exec rm -rf {} 和奇怪的消息,表明未找到文件

寻找 。 - exec rm -rf {} 和奇怪的消息,表明未找到文件

我有一个用于创建备份和删除旧备份的脚本。它有这一行:

 find . -type d -mtime +29 -user admin -name "20*" -exec rm -rf {} \;

这样,备份超过 29 天的目录将被删除。这有效,目录被删除,但每次都会显示此消息:

find: `./2020-06-16-23-30': No such file or directory

(消息中的日期发生变化)

请告诉我为什么出现此消息以及如何更正脚本。

使用输出重定向 ( >/dev/null 2>&1) 不适合我,因为我希望看到有关一些实际错误的消息。

这是包含备份的目录列表:

$ cd /volume1/Backup && ls -l
drwxr-xr-x  2 admin users       4096 Jun 19 23:30 2020-06-19-23-30
drwxr-xr-x  2 admin users       4096 Jun 20 23:30 2020-06-20-23-30
drwxr-xr-x  2 admin users       4096 Jun 21 23:30 2020-06-21-23-30
drwxr-xr-x  2 admin users       4096 Jun 22 23:30 2020-06-22-23-30
drwxr-xr-x  2 admin users       4096 Jun 23 23:30 2020-06-23-23-30
drwxr-xr-x  2 admin users       4096 Jun 24 23:30 2020-06-24-23-30
drwxr-xr-x  2 admin users       4096 Jun 25 23:30 2020-06-25-23-30
drwxr-xr-x  2 admin users       4096 Jun 26 23:30 2020-06-26-23-30
drwxr-xr-x  2 admin users       4096 Jun 27 23:30 2020-06-27-23-30
drwxr-xr-x  2 admin users       4096 Jun 28 23:30 2020-06-28-23-30
drwxr-xr-x  2 admin users       4096 Jun 29 23:30 2020-06-29-23-30
drwxr-xr-x  2 admin users       4096 Jun 30 23:30 2020-06-30-23-30
drwxr-xr-x  2 admin users       4096 Jul  1 23:30 2020-07-01-23-30
drwxr-xr-x  2 admin users       4096 Jul  2 23:30 2020-07-02-23-30
drwxr-xr-x  2 admin users       4096 Jul  3 23:30 2020-07-03-23-30
drwxr-xr-x  2 admin users       4096 Jul  4 23:30 2020-07-04-23-30
drwxr-xr-x  2 admin users       4096 Jul  5 23:30 2020-07-05-23-30
drwxr-xr-x  2 admin users       4096 Jul  6 23:30 2020-07-06-23-30
drwxr-xr-x  2 admin users       4096 Jul  7 23:30 2020-07-07-23-30
drwxr-xr-x  2 admin users       4096 Jul  8 23:30 2020-07-08-23-30
drwxr-xr-x  2 admin users       4096 Jul  9 23:30 2020-07-09-23-30
drwxr-xr-x  2 admin users       4096 Jul 10 23:30 2020-07-10-23-30
drwxr-xr-x  2 admin users       4096 Jul 11 23:30 2020-07-11-23-30
drwxr-xr-x  2 admin users       4096 Jul 12 23:30 2020-07-12-23-30
drwxr-xr-x  2 admin users       4096 Jul 13 23:30 2020-07-13-23-30
drwxr-xr-x  2 admin users       4096 Jul 14 23:30 2020-07-14-23-30
drwxr-xr-x  2 admin users       4096 Jul 15 23:30 2020-07-15-23-30
drwxr-xr-x  2 admin users       4096 Jul 16 23:30 2020-07-16-23-30

答案1

这看起来像一个竞争条件:

假设你有一个文件/a/b/c并且运行find /a -exec rm -rf {} \;

在某些情况下(并非总是)事情会按照这个顺序发生

  1. find会注意到并/a/b存在/a/b/c并记住它们
  2. 它将启动,rm -rf /a/b这将同时删除/a/b/a/b/c
  3. 它不会知道文件/a/b/c已经消失了,它仍然会尝试删除这个(不存在的)文件,然后你就会收到错误。

可能的解决方案:

  • 你可以做什么:使用正则表达式过滤以No such file or directoryout结尾的行
  • 什么可能会更好:(首先通过放置echo在前面进行测试rm -rf):
find . -type d -mtime +29 -user admin -name "20*" > /tmp/list_of_dirs
perl -ne 'system("rm -rf $_") < /tmp/list_of_dirs
  • 我自己会做什么:我不会认为这是一个真正的问题。如果rm会破坏某些目录,您可能会注意到它......

相关内容