查找并删除其中的文件夹+文件

查找并删除其中的文件夹+文件

我得到了这样的目录结构:

/backups/
/backups/db/
/backups/db/01.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/02.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

现在我运行这个命令:

find /backups/db/ -mindepth 1 -mtime +2 -delete && rsync ...

当我直接在 shell 中执行此命令时,它起作用,结果是:

/backups/
/backups/db/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

如果我通过 cronjob 运行此命令,目录将不会被删除,结果是:

/backups/
/backups/db/
/backups/db/01.01.2020/
/backups/db/02.01.2020/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz

发生这种情况的原因是find首先删除这 (2) 个文件夹中的文件,并且此操作会更改这些文件夹的日期,以便它们不再与-mtime +2.

有什么解决办法吗?我的意思是我可以接受这样的事情,但如果没有必要,我通常不喜欢与 rm 一起工作。

find /backups/db/ -mindepth 1 -mtime +6 -type d -exec rm -r {} +

查找(GNU findutils)4.7.0-git

答案1

我建议您分两步执行此操作,并且只删除文件第一步:

find /backups/db -mindepth 1 -type f -mtime +2 -delete

然后删除空目录:

find /backups/db -mindepth 1 -type d -empty -delete

这样您就根本不需要比较目录上的时间戳。

您可以将这两个操作组合成

find /backups/db -mindepth 1 \
    \( \( -type f -mtime +2 \) -o \
       \( -type d -empty    \) \) -delete

...但你可能想-delete先检查一下它是否做了正确的事情。

相关内容