根据文件名中给出的日期删除文件

根据文件名中给出的日期删除文件

在一个目录中,我有一些 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从变量中删除第一部分,因为它没有像本示例中那样单独传递到循环中。DBSOURCEf*[0-9]...[0-9].gz*date=${f#*}*forDBSOURCE

如果文件名结构始终相同,您可以简单地使用

date=${f//[^0-9]/}

删除所有非数字字符(实际上用“无”替换所有非数字字符)

另一种方法是使用tr提取日期:

date=`echo $f|tr -d '[:alpha:] [:punct:]'`

相关内容