删除日期字符串早于X天的yyyy-MM-dd文件夹

时间:2019-01-10 03:16:26

标签: linux bash date find

我有一个目录,其中有一堆以yyyy-MM-dd格式命名的文件夹。我想删除所有yyyy-MM-dd字符串早于X天的文件夹。

# ls
2018-01-01
2018-01-02
2018-01-03
...
2018-02-01
2018-03-05
...
2019-01-02
2019-01-02

有可能找到这样的东西吗?

更新:

此问题不是Delete files older than specific date in linux的重复,因为它涉及按mtime查找文件,我想按文件名查找与日期字符串匹配的文件。例如,目录名称可以是2012-01-01,但它的mtime可以是2018-03-11。这就是mtime或其他任何日期/时间元数据无法满足我的需求的原因。

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式获取自UNIX时代以来的天数:

echo $(($(date +%s)/86400))

您可以对格式与上面相同的字符串进行相同的操作:

echo $(($(date +%s --date "2018-01-01"))/86400)

然后是“今天”和任意日期之间的天数:

echo $(($(date +%s)/86400 - $(date +%s --date "2018-01-01")/86400))

将其循环包装,您应该会很好:

for DIR in `ls -1`
do
    # if the directory name is parseable as a date...
    if date "$DIR" &>/dev/null
    then
        age=$(($(date +%s)/86400 - $(date +%s --date "$DIR")/86400))
        echo "$DIR is $age days old"
        # do something based on its age
        if [ $age -gt 30 ]
        then
            #rm -fr "$DIR"
            echo $DIR
        fi
    fi
done

答案 1 :(得分:0)

如前所述,bash不支持内置的日期和时间功能。 尽管date命令有时对于补偿它很有用,但该命令 有很多差异,通常会导致兼容性问题。 建议使用其他编程语言 本机支持日期和时间算术。
这是python中的示例:

#!/usr/bin/python

import glob
import re
import datetime
import shutil
import os

retention = 100     # or whatever period you want to preserve
now = datetime.datetime.now()

for dir in glob.glob("*-*-*"):
    if re.search("^\d{4}-\d{2}-\d{2}$", dir):
        dt = datetime.datetime.strptime(dir, "%Y-%m-%d")
        if ((now - dt).days > retention):
            shutil.rmtree(dir)

希望这会有所帮助。