我想删除超过 7 天的备份但保留每月的第一天的备份。
文件的名称是:name_$(date +\%d\%m\%Y).tar.gz
我想保留:name_$(date +\01\%m\%Y).tar.gz
我想要这样的东西:
find /path -mtime +8 -exec rm {} \;
我可以融入哪里name_$(date +\01\%m\%Y).tar.gz
?
也许使用--exclude name_$(date +\01\%m\%Y).tar.gz
我正在寻找一行命令。
不想要子目录。
用 echo 尝试了一下,效果不佳,但它显示了部分 01。
只是--exclude
不起作用:command not found
答案1
这在 Debian/Ubuntu 下对我有效(并且应该在大多数情况下有效):
例如,如果您有以下格式的文件:
我的备份_2015 年 12 月 1 日压缩文件
$ find ./* -name 'mybackup_??-01-*' -prune -o -mtime +7 -exec ls {} \;
命令:
- 查找从当前文件夹开始的所有文件
- 删除(忽略/排除)日期匹配为“01”的文件
- 并且仅包括≥7天(mtime)的文件
- 执行
ls
以显示剩余的内容。
如果您想在测试命令后删除它们,只需替换
ls
为rm
。
如果您对命令感到满意,它也可以很好地用作 cron 任务/作业。我让它每几个月执行一次我的脚本。(我的脚本使用 +90 天的 mtime 来清理 mysql 备份)
答案2
删除除月初以外 7 天以上的文件。
find . ! -name '*01.tar.gz' -mtime +7 -exec rm {} \;
这确实:
find .
:在当前目录中执行查找。替换.
为任何其他目录。!
(相当于-not
):反转下一步操作。-name '*01'
:查找以 结尾的文件01.tar.gz
。在我的例子中,文件以 dateYYYYMMDD
格式结尾,因此这会过滤掉每个月的第一个文件。需要使用引号,这样 bash 就不会扩展星号。由于之前的 ,此过滤器被否定!
。-mtime +7
:过滤超过7天的文件。-exec rm {} \;
:rm
对每个选定文件执行。测试获取选定文件列表时,请删除此选项。
删除除月初以外 7 天前的目录。
在我的例子中,我的 mongodb 备份存储在单独的目录中。为了清除旧文件,我执行了以下命令:
find . -maxdepth 1 ! -name 'db_backup_*01' -mtime +7 -exec rm -r {} \;
主要变化:
-maxdepth 1
:这将目录深度搜索限制为 1,这意味着搜索将限制在当前目录中。-exec rm -r {} \;
:若要删除目录,-r
需要参数rm
。