在一个目录中,我有一些 zip 文件,如下所示:
DBSOURCE20150601.gz
WINDOWS20150504.gz
NETWORK20150609.gz
PATCHTEST20150512.gz
.................
................
我想删除根据文件名中给出的日期超过 10 天的 zip 文件。例如,
WINDOWS20150604.gz is file having date 4 June 2015.
我正在尝试执行以下操作,但不确定为什么它会删除所有 zip 文件而不是仅删除 10 天前的文件:
ten_days=$(date -d "10 days ago" +%Y%m%d)
for f in *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].gz; do
date=${f#*}
date=${date%.gz}
(( $date < $ten_days )) && rm "$f"
done
答案1
未从文件名中正确提取日期。为此,您需要执行以下操作
date=${f#*}
date=${date%.gz}
date=`echo $date| rev `
date=${date:0:8}
date=`echo $date| rev `
该日期现在可用于比较和删除
答案2
我认为您希望在第一行中,例如该命令将从变量中date=${f#*}
删除,因为您通过 引用了它。您不能使用in从变量中删除第一部分,因为它没有像本示例中那样单独传递到循环中。DBSOURCE
f
*[0-9]...[0-9].gz
*
date=${f#*}
*
for
DBSOURCE
如果文件名结构始终相同,您可以简单地使用
date=${f//[^0-9]/}
删除所有非数字字符(实际上用“无”替换所有非数字字符)
另一种方法是使用tr
提取日期:
date=`echo $f|tr -d '[:alpha:] [:punct:]'`