根据文件名比较和 tar 文件的 2 种日期格式

根据文件名比较和 tar 文件的 2 种日期格式

我需要将 4 个月后的文件(前 3 个月 + 当前 1 个月)保存在目录中,并 tar 其余部分。但问题是我的文件由不同的格式组成。

StockList_03-01-2015.txt
Ref_01-02-2016.txt
Data_2015-07-20.txt
Test_2016-01-13.txt

如上面的示例,日期可以是年-月-日或者年-月-日格式,我需要从文件名中提取日期并比较它是否不在(前 3 个月 + 1 当前月份)范围内,然后将其压缩。

今天是 3 月 2 日,从 2015 年 12 月 1 日到今天的文件将保留,但会对其他文件进行焦油处理。

示例中预期的 tar 文件:

StockList_03-01-2015.txt
Data_2015-07-20.txt

我可以为这两种类型的日期格式编写正则表达式,但我不知道如何组合它们。

yyyy-mm-dd 的正则表达式:

ls |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'   

dd-mm-yyyy 的正则表达式:

ls |grep -Eo '[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}'

比较日期:

files=($(ls | awk -v d=$(date -d '3 months ago' +%m-%Y.log) 'DATE_FROM_FILES< d {print;}' ))

tar cvzf archive.tar.gz "${files[@]}"

答案1

假设给定的常规文件名格式,其中日期是扩展名之前的最后一部分,并且紧随其后的是下划线,再加上扩展名始终为 .txt,您可以使用如下所示的脚本

d=$(date -d '3 months ago' +%Y-%m)
files=()
ls | while read f ; do
    df1="${${f##*_}%.txt}"
    df2=${df1//-//}
    df=$( date --date $df1 +%Y-%m 2>/dev/null || date --date $df2 +%Y-%m)
    [[ "$df" < "$d" ]] && files=( $files $f )
done
tar cvzf archive.tar.gz "${files[@]}"
# rm ${files[@]}

这里的关键方面是:要比较的日期字符串必须将年份值放在月份值的左侧,以便字母顺序作为日期顺序有意义。接下来,该date命令可以将日期取为 asyyyy-mm-dd或 as dd/mm/yyyy;因此,$df1通过首先删除文件名中最后一个下划线(包括最后一个下划线)之前的所有内容,然后删除.txt扩展名来从文件名中获得。是通过替换$df2得到的。-/

这样,$df1和中的一个或另一个$df2应该可以确定文件名的日期部分,并将其修改为yyyy-mm用于比较的格式。请注意,date失败并显示 for a date 错误消息dd-mm-yyyy,然后脚本将其通过管道传递给/dev/null

然后,只需整理剪切日期之前的文件名,将其压缩,然后(注释掉)删除压缩的文件即可。

相关内容