根据目录名称删除旧目录?

根据目录名称删除旧目录?

在我的 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直到010620002015 年 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/*

这里我换算成秒数。我不得不重新安排DDMMYYYYYYYMMDD,因为我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

替换echorm -r并更新路径。

相关内容