Unix shell脚本根据文件名中的“日期字符串”对文件进行排序

时间:2013-04-17 10:36:20

标签: shell unix

我正在尝试对目录中的文件进行排序,具体取决于文件名中附加的“日期字符串”,例如文件如下所示 SSA_F12_05122013.request.done SSA_F13_12142012.request.done SSA_F14_01062013.request.done 05122013,12142012和01062013表示格式的日期。 请帮我提供一个unix shell脚本来对这些文件中的日期字符串进行排序(按降序和升序排列)。

提前致谢。

4 个答案:

答案 0 :(得分:2)

嗯...当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选项定义一个“排序键”:

-k 1.13,1.16

这定义了一个排序键,范围从字段1,第13列到第1列,第16列。(默认情况下,字段由空格分隔,文件名没有。)

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

有关详细信息,请参阅man sort。使用-r选项按降序排序。

答案 1 :(得分:0)

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'

答案 2 :(得分:0)

使用awk和sort的一种方式:

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

答案 3 :(得分:0)

ls *.done | perl -pe 's/^.*_(..)(..)(....)/$3$2$1$&/' | sort -rn | cut -b9-

这会做+