Unix shell脚本,用于根据';日期字符串';以其文件名显示

Unix shell脚本,用于根据';日期字符串';以其文件名显示,shell,unix,Shell,Unix,我试图根据文件名中附加的“日期字符串”对目录中的文件进行排序,例如,文件如下所示 SSA_F12_05122013.请求.完成 SSA_F13_12142012.请求.完成 SSA_F14_01062013.请求.完成 其中0512201312142012和01062013表示格式中的日期。 请帮助我提供一个unixshell脚本,根据文件名中的日期字符串对这些文件进行排序(降序和升序) 提前感谢。awk和排序的单向: ls -lrt *.done | perl -lane '@a=split

我试图根据文件名中附加的“日期字符串”对目录中的文件进行排序,例如,文件如下所示
SSA_F12_05122013.请求.完成
SSA_F13_12142012.请求.完成
SSA_F14_01062013.请求.完成
其中0512201312142012和01062013表示格式中的日期。 请帮助我提供一个unixshell脚本,根据文件名中的日期字符串对这些文件进行排序(降序和升序)


提前感谢。

awk和排序的单向:

ls -lrt *.done | perl -lane '@a=split /_|\./,$F[scalar(@F)-1];$a[2]=~s/(..)(..)(....)/$3$2$1/g;print $a[2]." ".$_' | sort -rn | awk '{$1=""}1'
ls -1|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|sort|awk '$0=$NF'
如果我们将其分解:

ls -1|
awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|
sort|
awk '$0=$NF'
ls-1
就是一个例子。我想你有办法得到文件列表,每行一个

稍微测试一下:

kent$  echo "SSA_F13_12142012.request.done
SSA_F12_05122013.request.done
SSA_F14_01062013.request.done"|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|
sort|
awk '$0=$NF'
SSA_F13_12142012.request.done
SSA_F14_01062013.request.done
SSA_F12_05122013.request.done

这就可以了。。。当
sort
本身能够定义排序的确切依据时,为什么要调用awk和Perl这样的重量级软件呢

ls SSA_F*.request.done | sort -k 1.13,1.16 -k 1.9,1.10 -k 1.11,1.12 
每个
-k
选项定义一个“排序键”:

这定义了从字段1第13列到字段1第16列的排序键。(默认情况下,字段由空白分隔,而您的文件名没有空白。)

如果文件名的长度不同,可以将下划线定义为字段分隔符(使用
-t
选项),然后在第三个字段中寻址列


有关详细信息,请参阅人工分拣。使用
-r
选项按降序排序。

当您尝试自己做这件事时,您被哪个部分卡住了?John,我是这个平台的初学者,不知道如何做。我尝试使用sort命令,但无法获取filename部分(包含日期)并根据该部分对文件进行排序。请帮我解决这个问题。找到负责命名模式的人,狠狠地踢他的屁股,因为他一开始没有把模式简单地分类。然后看看你是否能改变模式。YYYY-MM-DD不仅是可排序的,而且是明确的。(如果不是因为
12142012
,我不知道你的例子中哪些数字是“月”,哪些是“日”。)你也可以通过
awk'{print$NF}'
来获取文件名。这真的很有帮助。执行上面的命令,将错误作为awk:syntax error靠近第1行awk:bailing out靠近第1行我尝试执行下面的命令删除'awk'部分,ls-lrt*.done | perl-lane'@a=split/| \./,$F[标量(@F)-1]$a[2]=~s/(…)(…)/$3$2$1/g;打印$a[2]。“”.$| sort-rn它将按预期的排序方式返回结果。我不确定我们使用了什么awk命令,也不理解上面的命令,因为我的知识非常有限:)。您的回答非常有帮助,对上述命令的任何描述都非常感谢。非常感谢,西德哈特,它能工作,但我不能清楚地理解完整的陈述:),请简要说明上述语句中的每个命令都在做什么。使用perl替换命令,我们将以YYYYMMDD格式重新排列日期,并将其临时附加到文件名的开头,以便排序正常运行。在使用cut-b9对前8个字符进行排序后,您可以参考perl正则表达式语法。谢谢Dev,您是正确的,但是如果我的文件名长度不同(例如SSA_F12_05122013.request.done和SSA_F9_05122013.request.done),那么我认为我们不能继续处理文件名中字符的位置。有什么解决办法吗?好吧,在再次踢了负责人之后;-)您可以使用
sort-f'-k 3.5,3.8-k3.1,3.2-k3.3,3.4
。(将“u”作为字段分隔符,并在第三个字段(即日期)中寻址列。)警告,未经测试,使用风险自负(或者更确切地说,请在使用生产数据之前进行测试)。太棒了!帮助很大。谢谢顺便说一下,对于分隔器its-t和not-f。
ls SSA_F*.request.done | sort -k 1.13,1.16 -k 1.9,1.10 -k 1.11,1.12 
-k 1.13,1.16