复杂 find 语句

复杂 find 语句

我有一个脚本,用于清除旧的备份目录。所有目录都命名为 YYYY-MM-DD。备份目录中有链接,因为备份是使用 rsync --link-dest 增量备份的。当我运行传统的 find 语句时,由于它会删除链接,因此它会更改文件夹的修改时间,所以我的脚本最终会删除所有文件,但不会删除实际文件夹。因为脚本会查看修改时间。

find /backups/stores/ -maxdepth 2 -type d ! -name '????-??-01' -mtime +60 -exec rm -rf {} \;

有没有更简单(更好)的方法来根据名称而不是修改时间删除这些文件夹。由于它们已经全部命名为 YYYY-MM-DD,我们可以使用 date 命令或其他方法来查看名称,然后删除名称超过 60 天且日期字段中没有 1 的任何内容(希望保留所有月份第一天的文件夹)。

有啥想法?谢谢

答案1

解决此备份目录清除问题的方法是调整 find 语句,使其关注目录名称而不是修改时间。无需担心这些讨厌的链接会弄乱您的脚本。

除了使用“find”命令,您还可以使用“date”和“rm”命令的巧妙组合。让我们让“date”命令通过计算 60 天前的日期来完成繁重的工作,然后使用“rm”清理那些旧目录。

find /backups/stores/ -maxdepth 2 -type d ! -name '????-??-01' -exec sh -c 'dir_date=$(date -d "${1##*/}" "+%Y%m%d"); sixty_days_ago=$(date -d "60 days ago" "+%Y%m%d"); if [ $dir_date -lt $sixty_days_ago ]; then rm -rf "$1"; fi' sh {} \;

只需将其粘贴到您的终端即可。它将删除那些超过 60 天的旧目录,但会保留那些特殊的月初目录。

相关内容