我的目录名称为
./一个/ 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并查看修改日期,但由于我们有将来的日期,这些日期通常不会被修改几个月,这在此特定情况下不是一个选项。我在这里有点困惑,因为在这种情况下我无法找到一个好的解决方案。
答案 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>
然后我们遍历目录a
和b
中的所有目录(这就是扩展的glob @(a|b)/*/
所做的)。对于每个目录,在删除尾部斜杠和前导目录名称(最多为第一个斜杠)之后,我们检查我们是否有XXXX-XX-XX
形式的名称,其中X
是数字,最后我们与保存的数据透视表进行字符串比较。
这不会删除任何文件,它只会回显像
这样的行rm -r a/2015-01-01/
rm -r b/2015-01-01/
如果对结果感到满意,请删除前导echo
,并希望实际删除目录。