Unix - 使用密钥对文件名进行排序,但不知道其位置

时间:2014-03-26 15:26:41

标签: sorting unix filenames

我想使用Unix命令对这些文件进行排序:

MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz

我在这里等待的结果是MyFile_fdfdsf_20140326.txt

所以我想获得最新日期的文件。

我不能使用'sort -k',因为键的位置(日期)可能会有所不同 但在我的文件名中总有两个“_”分隔符和一个点“。”用于文件扩展名

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

然后使用-t表示字段分隔符并将其设置为_

sort -t'_' -k3

请参阅文件名的排序示例(如果文件名在文件中)。我使用-n进行数字排序,使用-r进行反向排序:

$ sort -t'_' -nk3 file
MyFile_dfgfdklm_19990101.tar.gz
MyFile_4fg5d6_20100301.csv
MyFile_fdfdsf_20140326.txt

$ sort -t'_' -rnk3 file
MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz

来自man sort

  

-t , - field-separator = SEP

     

使用SEP代替非空白到空白转换

     

-n , - 数字排序

     

根据字符串数值进行比较

     

-r , - 反向

     

反转比较结果

更新

  

谢谢你的回答。它非常完美。但出于好奇,如果   我有一个未知数量的分隔符,但日期总是在之后   最后一个" _"分隔符。 MyFile_abc_def _... 20140326.txt sort -t' '   -NK ??? file - user3464809

您可以稍微欺骗它:打印最后一个字段,排序然后将其删除。

awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2-

查看示例:

$ cat a
MyFile_fdfdsf_20140326.txt
MyFile_4fg5d6_20100301.csv
MyFile_dfgfdklm_19990101.tar.gz
MyFile_dfgfdklm_asdf_asdfsadfas_19940101.tar.gz
MyFile_dfgfdklm_asdf_asdfsadfas_29990101.tar.gz

$ awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2-
dfgfdklm_asdf_asdfsadfas_19940101.tar.gz
dfgfdklm_19990101.tar.gz
4fg5d6_20100301.csv
fdfdsf_20140326.txt
dfgfdklm_asdf_asdfsadfas_29990101.tar.gz