如何按版本号对文件名进行排序?

时间:2010-10-28 08:49:55

标签: bash sorting shell version

在目录“data”中是这些文件:

  

命令1.9A-设置
  命令2.0A-设置
  命令2.0C-设置
  command-2.0-setup

我想对文件进行排序以获得此结果:

  

命令1.9A-设置
  命令-2.0-设置
  命令2.0A-设置
  command-2.0c-setup

我试过这个

find /data/ -name 'command-*-setup' | sort --version-sort --field-separator=- -k2 

但输出是

  

命令1.9A-设置
  命令2.0A-设置
  命令2.0C-设置
  command-2.0-setup

我找到的唯一方法就是给了我想要的输出

tree -v /data

我怎么能按照想要的顺序对输出进行排序?

6 个答案:

答案 0 :(得分:25)

如果您指定排序,您只想考虑第二个字段(-k2),请不要抱怨它不考虑第三个字段。

在你的情况下,运行sort --version-sort而没有任何其他参数,这可能更适合。

答案 1 :(得分:8)

编辑: 事实证明,Benoit在正确的轨道上走得很好,而Roland提供了平衡

您只需告诉sort仅考虑 字段2(添加“,2”):

find ... | sort --version-sort --field-separator=- --key=2,2

原始答案: 忽略

如果您的文件名都没有在连字符之间包含空格,您可以尝试:

find ... | sed 's/.*-\([^-]*\)-.*/\1 \0/;s/[^0-9] /.&/' | sort --version-sort --field-separator=- --key=2 | sed 's/[^ ]* //'

第一个sed命令使这些行看起来像这样(我添加了“10”来表示排序是数字的):

1.9.a command-1.9a-setup
2.0.c command-2.0c-setup
2.0.a command-2.0a-setup
2.0 command-2.0-setup
10 command-10-setup

额外的点使得带有后缀版本号的字母排序在没有后缀的版本号之后。第二个sed命令从每行中删除带前缀的版本号。

有很多方法可能会失败。

答案 2 :(得分:2)

看起来很有效:

find /data/ -name 'command-*-setup' | sort -t - -V -k 2,2

不是排序但它有效:

tree -ivL 1 /data/ | perl -nlE 'say if /\Acommand-[0-9][0-9a-z.]*-setup\z/'

-v:按版本对输出进行排序 -i:使树不打印压痕线
-L level:目录树的最大显示深度

答案 3 :(得分:0)

$ cat files
command-1.9a-setup
command-2.0c-setup
command-10.1-setup
command-2.0a-setup
command-2.0-setup

$ cat files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup

$ tac files | sort -t- -k2,2 -n
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup

答案 4 :(得分:0)

另一种方法是填充电话号码。

此示例将所有数字都填充为8位数字。 然后,它执行简单的字母数字排序。 然后,将其取下。

$ pad() { perl -pe 's/(\d+)/0000000\1/g' | perl -pe 's/0*(\d{8})/\1/g'; }
$ unpad() { perl -pe 's/0*([1-9]\d*|0)/\1/g'; }
$ cat files | pad | sort | unpad
command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup
command-10.1-setup

要深入了解其工作原理,让我们看一下填充后的排序结果:

$ cat files | pad | sort
command-00000001.00000009a-setup
command-00000002.00000000-setup
command-00000002.00000000a-setup
command-00000002.00000000c-setup
command-00000010.00000001-setup

您会看到所有数字都很好地填充到8位数字,字母数字排序将文件名按其所需顺序排列。

答案 5 :(得分:0)

我在一个文件夹中有文件,需要根据编号以排序顺序获得这些名称。例如。 -

abc_dr-1.txt
hg_io-5.txt
kls_er_we-3.txt
sd-4.txt
sl_rt_we_yh-2.txt

我需要根据数字对它们进行排序。 所以我用这个来排序。

ls -1 | sort -t '-' -nk2

它给了我文件编号的顺序。