如何在linux中按特定部分对文件名进行排序?

oko*_*oko 1 linux sorting bash

我的构建文件夹中有很多文件,我正在尝试使用sort命令对它们进行排序.

文件的结构是这样的:

name - version - 'v' - 构建日期

xxx-2.0.0-SNAPSHOT-V2014-07-10_18-01-05.log
xxx-2.0.0-SNAPSHOT-V2014-07-10_18-02-05.log
xxx-2.0.0-SNAPSHOT-V2014-07- 10_18-03-05.log
xxx-2.0.0-SNAPSHOT-V2014-07-10_18-04-05.log
xxx-2.0.0-SNAPSHOT-V2014-07-10_18-05-05.log

如果我们假设版本字符串将保持3位数,那么对它们进行排序很容易.如果我在这里添加2.1或2.0.0.2等不同版本怎么办?我需要这样的结果:

xxx-2.1-SNAPSHOT-V2014-07-10_18-05-05.log
xxx-2.0.2-SNAPSHOT-V2014-07-10_18-04-05.log
xxx-2.0.0.2-SNAPSHOT-V2014-07-10_18- 03-05.log
xxx-2.0.0.1-SNAPSHOT-V2014-07-10_18-02-05.log
xxx-2.0.-SNAPSHOT-V2014-07-10_18-01-05.log

ani*_*ane 8

$ cat file
xxx-2.0.2-SNAPSHOT-V2014-07-10_18-04-05.log
xxx-2.0.0.2-SNAPSHOT-V2014-07-10_18-03-05.log
xxx-2.1-SNAPSHOT-V2014-07-10_18-05-05.log
xxx-2.0.0.1-SNAPSHOT-V2014-07-10_18-02-05.log
xxx-2.0.-SNAPSHOT-V2014-07-10_18-01-05.log 

$ sort -V -r -t- -k2,2 < file
xxx-2.1-SNAPSHOT-V2014-07-10_18-05-05.log
xxx-2.0.2-SNAPSHOT-V2014-07-10_18-04-05.log
xxx-2.0.0.2-SNAPSHOT-V2014-07-10_18-03-05.log
xxx-2.0.0.1-SNAPSHOT-V2014-07-10_18-02-05.log
xxx-2.0.-SNAPSHOT-V2014-07-10_18-01-05.log 
Run Code Online (Sandbox Code Playgroud)

注意:某些实现sort不支持-V选项...

说明:

  • -V:版本排序
  • -t-:拆分为带分隔符的列' - '
  • -k2,2:按字段2排序,仅排序2
  • -r:反向排序(基于您的预期输出.如果不需要,请删除此标志.)