在不使用修改时间的情况下删除名称小于模式的子目录

时间:2015-01-30 12:49:29

标签: bash

我的目录名称为

./一个/ 2015年1月1日
./a/2015-08-08
./a/2015-10-12
./a/2015-12-12
./a/2016-01-31
./b/2015-01-01
./b/2015-08-08
./b/2015-10-12
./b/2015-12-12
./b/2016-01-31

如何使用bash shell脚本删除名为10天以上日期的旧条目?

通常我会使用find并查看修改日期,但由于我们有将来的日期,这些日期通常不会被修改几个月,这在此特定情况下不是一个选项。我在这里有点困惑,因为在这种情况下我无法找到一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

这应该做:

#!/bin/bash

shopt -s extglob nullglob

pivot=$(date -d '10 days ago' +%F) || { echo >&2 "error in date"; exit 1; }
for i in @(a|b)/*/; do
    f=${i%/}
    f=${f#*/}
    if [[ $f =~ [[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} ]] && [[ $f < "$pivot" ]]; then
        echo rm -r "$i"
    fi
done

我们正在使用date获取10天前日期的YYYY-MM-DD格式(即%F修饰符),并将其保存在变量pivot中。< / p>

然后我们遍历目录ab中的所有目录(这就是扩展的glob @(a|b)/*/所做的)。对于每个目录,在删除尾部斜杠和前导目录名称(最多为第一个斜杠)之后,我们检查我们是否有XXXX-XX-XX形式的名称,其中X是数字,最后我们与保存的数据透视表进行字符串比较。

这不会删除任何文件,它只会回显像

这样的行
rm -r a/2015-01-01/
rm -r b/2015-01-01/

如果对结果感到满意,请删除前导echo,并希望实际删除目录。