我需要将 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
然后,只需整理剪切日期之前的文件名,将其压缩,然后(注释掉)删除压缩的文件即可。