我正在尝试编写一个命令,仅保留最后 2 个备份并删除其余目录。
directory path = /apps/
以下是目录,这里我只想保留
source
source_2020-01-13
source_2019-12-09
目录并删除旧的。该脚本将使用 cron 在 100 多个服务器上运行。
这里的问题是,在find
命令中我将无法添加mtime
或删除旧目录 - 为什么因为备份目录时间戳在所有服务器上都不相同。基本上,命令/脚本应保留最后两个名为 source_YYYY_MM_DD 的备份目录,并删除其余的目录。
有人可以帮忙吗?
笔记 :来源_YYYY_MM_DD是备份目录。
drwx------ 11 root root 4096 Jul 22 2019 source_2019-07-22
drwx------ 11 root root 4096 Jul 29 2019 source_2019-07-29
drwx------ 11 root root 4096 Aug 5 2019 source_2019-08-05
drwx------ 11 root root 4096 Aug 14 2019 source_2019-08-14
drwx------ 11 root root 4096 Oct 14 2019 source_2019-10-14
drwx------ 11 root root 4096 Dec 9 03:59 source_2019-12-09
drwx------ 11 root root 4096 Jan 13 05:20 source_2020-01-13
drwxr-x--- 12 root root 4096 Apr 21 09:11 source
答案1
ls -d1 /apps/source_20??-??-??/ | head -n -2 | xargs rm -rf
由此
ls -d1 /apps/source_20??-??-??/
将仅按排序顺序列出匹配的目录,
head -n -2
取出最后两个条目,
xargs rm -rf
然后删除目录。
答案2
find /apps/ -type d -not -name source -name "source*" -print | sort | head -n -2 | xargs rm -rfv
find apps/ -type d -not -name source -name "source*" -print
将找到所有备份目录,确保命令source
不会拾取这些目录find
。
sort
将排序,确保最新的排在最后。这不是基于修改时间,而是基于目录名称。
head -n -2
获取所有目录,最后 2 个备份目录。
xargs rm -rfv
删除除上一命令过滤的最后 2 个之外的所有备份目录。
(警告:如果目录名称包含空格,此命令将不起作用。始终先测试创建假目录并尝试此命令。)