在我的 bash 脚本中,我每月创建一个目录用于备份,如下所示:
DAY=$(date -d "$D" '+%d')
MONTH=$(date -d "$D" '+%m')
YEAR=$(date -d "$D" '+%Y')
mkdir -p /var/app/backup/$DAY$MONTH$YEAR
例如我得到:
01012000
01022000
01032000
.
.
01012014
01022014
01032014
01042014
.
.
多年后,我们想要删除超过半年的目录。例如 -01012000
直到01062000
2015 年 1 月 1 日为止的目录应被删除。
鉴于我们在目录名称中包含日期,删除超过半年的目录的最佳方法是什么(来自 bash 脚本)?
答案1
您可以将文件名转换为可以直接比较的内容(例如 Unix 时间戳(自纪元以来的秒数),或转换为YYYYMMDD
,可以按字典顺序排序),然后检查它是否超过六个月。
例如,像这样的脚本(例如,at /path/to/compare.sh
):
#! /bin/bash
LAST=$(date -d '6 months ago' +%s)
for FILE
do
NAME=$(basename $FILE)
DATE=$(perl -pe 's/(\d{2})(\d{2})(\d{4})/$3$2$1/' <<<$NAME)
if (( $(date -d "$DATE" '+%s') < $LAST ))
then
rm -r $FILE
fi
done
并做:
/path/to/compare.sh /var/app/backup/*
这里我换算成秒数。我不得不重新安排DDMMYYY
到YYYYMMDD
,因为我date
不接受前者作为有效日期。因此,转换为秒是多余的,但我不确定为什么date
拒绝前者(也许是区域设置问题?)。
答案2
我将重点关注您问题的删除部分。如果您有这样的文件名列表:
$ cat data.txt
01012000
01022000
01032000
01012014
01022014
01032014
01042014
您知道 6 个月的截止日期是“01022014”。您可以使用sort
&sed
来确定需要删除哪些文件,如下所示:
这将对文件进行反向排序:
$ sort -r data.txt
01042014
01032014
01032000
01022014
01022000
01012014
01012000
这将删除所有较新的文件,直至我们的截止日期“01022014”。
$ sort -r data.txt | sed '1,/01032000/d'
01022014
01022000
01012014
01012000
笔记: sed '1,/PATTERN/d'
删除(即)从第一行(即)开始直到遇到我们的 PATTERN 为止d
出现的所有行。1,
最后,可以将该列表发送到xargs
删除:
$ sort -r data.txt | sed '1,/01032000/d' | xargs rm
答案3
您可以使用范围大括号扩展:
每半年删除一次:
echo /path/to/directories/01{01..06}{2000..2014}
或者删除除过去半年之外的所有内容:
echo /path/to/directories/01{01..12}{2000..2013}
echo /path/to/directories/01{01..06}2014
替换echo
为rm -r
并更新路径。