【问题标题】:ls -l -> Sort files by regexls -l -> 按正则表达式排序文件
【发布时间】:2019-01-13 09:36:44
【问题描述】:

我有一个目录,其中包含来自不同应用程序的日志文件,其名称如下:

A_B_C.log.20180205125615.bin
A_B_C.log.20180205125616
A_B_C_20180205133700.log
A_B_C_1234_20180205133700.log
D_E_F_G.log.20180205125715.bin
D_E_F_G.log.20180205125716
D_E_F_G_20180205133800.log
D_E_F_G_1234_20180205133800.log

名称都包含一个 14 位数字(年、月、日、时间)的时间戳。

我想通过“ls -l”打印所有文件名,并按名称中的时间戳对其进行排序。

newes 文件(最大数)应在最后打印。 如果一个时间戳有多个匹配项,则这些文件应按字母顺序排序。

如何将“ls -l”与正则表达式排序结合起来?

【问题讨论】:

  • 您应该使用带有单独sort 的管道。

标签: regex linux sorting sh ls


【解决方案1】:

Perl 解决方案:

perl -le 'print for sort { ($a =~ /\d{14}/g)[0] cmp ($b =~ /\d{14}/g)[0]
                           or $a cmp $b } glob "*log*"'

有关如何在 Perl 中提供自定义比较器的详细信息,请参阅 sort

  • -l 在打印行中添加最后的换行符
  • \d{14} 匹配 14 位数字
  • /g 修饰符匹配返回列表上下文中匹配的子字符串,[0] 选择其中的第一个。

【讨论】:

  • 时间戳采用 yyyymmddhhmmss 格式,因此您应该对它们使用数字排序 <=> 而不是字符串排序 cmp
  • @JGNI:在这种情况下,没有区别。
  • 但这仍然是一个有用的习惯
  • @JGNI:我不明白为什么。来自正则表达式匹配,它们是字符串,因此无需将它们转换为数字。
  • 好吧,这只是我在玩日期和时间时开始做的事情。
【解决方案2】:

这行与 gnu sed 应该会有所帮助:

ls -1|sed -r 's/.*([0-9]{14}).*/\1 &/' f|sort -n|sed 's/^[0-9]* //' 

Ls 自己无法做到。思路是:取出时间戳,到每一行的头部作为key,然后按时间戳排序,最后去掉插入的时间戳。

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多