我有一系列 300 多个文件,需要排序两次,一次按日期排序,第二次在该日期内按文件名的一部分排序。
名称中的唯一标准是以 结尾*mmddyyyy<time stamp>.csv
,其中文件名的第一部分可以包含任何内容。我知道ls -ltr
给了我日期排序,但我似乎无法捕获和排序最后一个 keydef 的一部分。
答案1
鉴于从末尾查看文件名时,它们具有可预测的格式(扩展名然后时间然后日期),人们可以利用这一事实并使用以下命令:
ls -1 | rev | sort -t '~' -k1.14,1.14 -k1.13,1.13 -k1.12,1.12 -k1.11,1.11 -k1.18,1.18 -k1.17,1.17 -k1.16,1.16 -k1.15,1.15 | rev
说明:
- 文件名首先被反转,以便我们可以访问所需的格式
- 然后根据我们的需要,将结果逐个字符排序:
- - 字符 11 到 14 是年份(按相反顺序)
- - 字符 17到 18 是月份(按相反顺序)
- - 字符 15 到 16 是日期(按相反顺序)
- 最后发生另一个反转,以原始名称显示它们
我使用波形符~
作为分隔符,以便将整个文件名组合在一个字段中,但您可以使用不同的分隔符(它必须是文件名中从未出现的字符),或者只使用.
(点)来将文件名拆分为多个字段(如果它们的数量始终相同),以便您可以指定要排序的其他部分 - 对于第二个问题。