我得到了这样的目录结构:
/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
先检查一下它是否做了正确的事情。