根据时间戳匹配最接近的文件名

时间:2018-10-16 16:04:51

标签: shell unix

我们有备份存储在S3中,需要根据最近的时间戳来检索备份。我们已将文件存储在S3中,格式为YYYYMMDD_HHMM.tar.gz

20181009_0910.tar.gz
20181004_0719.tar.gz
20180925_0414.tar.gz
20180915_2210.tar.gz

鉴于时间戳为20180922_1020,我们需要使用shell脚本获取文件20180925_0414.tar.gz。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用Perl One衬垫(当然有些冗长!!)。

我了解“最近”是指两个方向之间的输入之间最短。也就是说,如果您有2个文件,Oct-1st.txt和Oct-30.txt,并且如果输入是Oct-20,则将输出Oct-30文件

$ ls -l *2018*gz
-rw-r--r-- 1 xxxx xxxx 0 Oct 17 00:04 20180915_2210.tar.gz
-rw-r--r-- 1 xxxx xxxx 0 Oct 17 00:04 20180925_0414.tar.gz
-rw-r--r-- 1 xxxx xxxx 0 Oct 17 00:04 20181004_0719.tar.gz
-rw-r--r-- 1 xxxx xxxx 0 Oct 17 00:04 20181009_0910.tar.gz

$ export input=20180922_1020

$ perl -ne 'BEGIN { @VAR=@ARGV; $in=$ENV{input}; $in=~s/_//g;foreach(@VAR) {$x=$_;s/.tar.gz//g;s/_//g;s/(\d+)/abs($1-$in)/e;$KV{$_}=$x};$res=(sort keys %KV)[0]; print "$KV{$res}"} ' 2018*gz
20180925_0414.tar.gz

$ export input=20180905_0101

$ perl -ne 'BEGIN { @VAR=@ARGV; $in=$ENV{input}; $in=~s/_//g;foreach(@VAR) {$x=$_;s/.tar.gz//g;s/_//g;s/(\d+)/abs($1-$in)/e;$KV{$_}=$x};$res=(sort keys %KV)[0]; print "$KV{$res}"} ' 2018*gz
20180915_2210.tar.gz

$

希望,这会有所帮助!