按版本对文件名进行排序

按版本对文件名进行排序

我正在尝试对目录中的文件名进行排序,如下所示。

$ ls -1v
file-1.10.0-114.1.1.x86.tb1_2.rpm  
file-1.10.0-114.2.2.x86.tb1_2.rpm  
file-1.10.0-114.11.2.x86.tb1_2.rpm  
file-1.10.0-114.x86.tb1_2.rpm  
file-1.10.0-115.1.1.x86.tb1_2.rpm  
file-1.10.0-115.2.2.x86.tb1_2.rpm  
file-1.10.0-115.3.1.x86.tb1_2.rpm  
file-1.10.0-115.22.1.x86.tb1_2.rpm  
file-1.10.0-115.x86.tb1_2.rpm  

但是,我的期望如下。

file-1.10.0-114.x86.tb1_2.rpm  
file-1.10.0-114.1.1.x86.tb1_2.rpm  
file-1.10.0-114.2.2.x86.tb1_2.rpm  
file-1.10.0-114.11.2.x86.tb1_2.rpm  
file-1.10.0-115.x86.tb1_2.rpm  
file-1.10.0-115.1.1.x86.tb1_2.rpm  
file-1.10.0-115.2.2.x86.tb1_2.rpm  
file-1.10.0-115.3.1.x86.tb1_2.rpm  
file-1.10.0-115.22.1.x86.tb1_2.rpm

我尝试过sort -V,但显示了相同的结果。我该如何排序?

答案1

尝试使用这个命令:

ls -h | sort -t. -k3,3 -k4,4n

ls -h- ls 命令的标准输出(如果用户名和组名不包含点,则可以使用 ls -lh 获得相同的结果);

-t.- 设置排序命令的分隔符;

-k3,3- 按第三个字段排序

在此之后...

-k4,4n- 按第四个字段数字排序

答案2

使用zsh,您可以执行以下操作:

print -rl file*.rpm(noe:'REPLY=${REPLY%.x*}':)

n对去掉尾部.x*部分的文件名进行数字 ( ) 排序。

您可以使用 GNU 执行类似的操作sort

ls | sort -Vtx -k 1,1

假设没有x其他地方,尽管那会遇到包含换行符的文件名问题。

或者你可以这样做:

print -rl file*.rpm(noe:'REPLY=${REPLY//(#m)<->/Z$MATCH}':)

(with extendedglob) 我们在每个数字前加上前缀ZsoZ115.xZ86...排序在 之前Z115.Z1...

相关内容