classificando os nomes dos arquivos com a versão

5

Estou tentando classificar nomes de arquivos em um diretório, conforme abaixo.

$ 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  

Mas minha expectativa era a seguinte.

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

Eu tentei sort -V , mas ele mostrou o mesmo resultado. Como faço para classificar desta maneira?

    
por kirk1370 24.08.2017 / 07:23

2 respostas

12

Tente usar este comando:

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

ls -h - saída padrão do comando ls (você pode usar ls -lh com o mesmo resultado, desde que os nomes de usuário e grupo não contenham pontos);

-t. - configurando o separador para o comando sort;

-k3,3 - classificação por terceiro campo

e depois disso ...

-k4,4n - classificação por quarto campo numericamente

    
por 24.08.2017 / 08:25
2

Com zsh , você pode fazer:

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

Isso é uma classificação numérica ( n ) no nome do arquivo retirado da parte .x* .

Você pode fazer algo parecido com o GNU sort com:

ls | sort -Vtx -k 1,1

assumindo que não há x em nenhum outro lugar, apesar de que haveria problemas com nomes de arquivos contendo caracteres de nova linha.

Ou você poderia fazer:

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

(com extendedglob ) onde prefixamos cada número com Z , então o Z115.xZ86... ordena antes do Z115.Z1... .

    
por 24.08.2017 / 16:09

Tags