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

sid*_*com 23 sorting bash shell version

在目录"data"中是这些文件:

command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
command-2.0-setup

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

command-1.9a-setup
command-2.0-setup
command-2.0a-setup
command-2.0c-setup

我试过这个

find /data/ -name 'command-*-setup' | sort --version-sort --field-separator=- -k2 
Run Code Online (Sandbox Code Playgroud)

但输出是

command-1.9a-setup
command-2.0a-setup
command-2.0c-setup
command-2.0-setup

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

tree -v /data
Run Code Online (Sandbox Code Playgroud)

我怎样才能按需要的顺序对输出进行排序?

Ben*_*oit 26

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

在你的情况下,sort --version-sort没有任何其他参数运行,也许这将更适合.


Pau*_*ce. 14

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

你只需要告诉sort考虑字段2(添加",2"):

find ... | sort --version-sort --field-separator=- --key=2,2
Run Code Online (Sandbox Code Playgroud)

原答案: 忽略

如果您的文件名中没有一个包含连字符之间的空格,您可以尝试这样做:

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

第一个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
Run Code Online (Sandbox Code Playgroud)

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

有很多方法可能会失败.