UNIX:按编号/版本对文件进行排序,不使用0填充

时间:2016-07-08 22:11:23

标签: bash shell sorting unix

最终,我想将最新版本设置为环境变量,因此补充所选答案(这为我提供了正确的排序):

export LATEST_VERSION=$(printf '%s\n' * | sort -rV | head -1)

我有一个包含以下目录名的目录:

ls -1r .
2.0
1.8
16.1
16.0
15.5
15.0
14.5
14.1
14.0
1.3
1.2
1.1.5
1.1.3
1.1.2

我想对它们进行排序以获得最新版本:

ls -1r . | head -1
16.1

因此基础订单应如下所示:

16.1
16.0
15.5
15.0
14.5
14.1
14.0
2.0
1.8
1.3
1.2
1.1.5
1.1.3
1.1.2

非常感谢任何帮助。越简单越好,但我对任何解决方案都持开放态度。谢谢!

2 个答案:

答案 0 :(得分:10)

现代GNU排序提供-V标志,用于根据版本号规则进行排序:

$ printf '%s\n' * | sort -rV
16.1
16.0
15.5
15.0
14.5
14.1
14.0
2.0
1.8
1.3
1.2
1.1.5
1.1.3
1.1.2

请注意,上述操作使用ls。作为一般规则,you shouldn't parse the output of ls(1)

文档

来自man sort

  

-V, - version-sort
   文本中的自然种类(版本)

以上内容来自GNU手册页。

FreeBSD's sort也支持-V

OSX

Apple的sort是从2005年开始的GNU排序,早于对-V选项的支持。可以找到解决方法here。 (帽子提示:l'L'l,mklement0)

答案 1 :(得分:-1)

FWIW,我现在在Mac OS,并没有启动到linux进行测试。 但是,看起来像数字选项的排序有聪明才能做到:

但是,我有一个包含子目录的目录,并且我很难对它进行排序:

/Users/thedave/tmp $ ls -1r
2.0
16.1.12
16.1
16.0
15.5
15.0
14.5
14.1
14.0
1.8
1.3
1.2
1.1.5
1.1.3
1.1.2
1.1
1.0.1
1.0

sort(1)接受'-n'代表数字,' - r'代表反向:

/Users/thedave/tmp $ ls | sort -rn
16.1.12
16.1
16.0
15.5
15.0
14.5
14.1
14.0
2.0
1.8
1.3
1.2
1.1.5
1.1.3
1.1.2
1.1
1.0.1
1.0