버전별로 파일 이름 정렬

버전별로 파일 이름 정렬

아래와 같이 디렉토리의 파일 이름을 정렬하려고합니다.

$ 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 ) 각 숫자 앞에 so를 extendedglob붙여서 정렬합니다 .ZZ115.xZ86...Z115.Z1...

관련 정보