숫자로 정렬 된 파일 나열


122

에서 log1까지 많은 파일이 있습니다 log164.

UNIX 터미널에서 디렉토리 (정렬)를 나열하려고하지만 정렬 기능은 다음과 같은 형식 만 제공합니다.

home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc

내가 원하는 것은

home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc

내가 이것을 할 수있는 제안이 있습니까?


8
이것은 절대적으로 프로그래밍 질문이며, 대답에 쉘이 낮은 프로그래밍 언어가 포함되어 있기 때문에 마이그레이션 할 가치가 없습니다 !!!
tchrist

이름이임을 log1.gz통해 사전에 알고 있다면 log164.gz무엇을해야 ls -1합니까?
ruakh

1
@ruakh ls -1은 결과가 아닌 하나의 열에 결과를 표시합니다.

3
@ Rabiani : 나는 무엇을 알고 있는지 ls -1: 그것은 파일 이름을 나열합니다. 파일 이름을 이미 알고 있으므로 필요한 것을 이해하지 못했습니다. 하지만 당신은 케빈의 대답을 받아들 였으므로 이제는 당신 필요 하지 않다는 것을 알고 있습니다. 더 의미가 있습니다. :-)
ruakh

답변:


40

bash의 중괄호 {}는 순서대로 열거합니다.

for file in log{1..164}.gz; do
    process "$file"
done

266

ls이 특별한 경우 에 내장 기능 을 사용하지 않는 이유

-v natural sort of (version) numbers within text

예를 들어 ls -1v log*


굉장한 해결책입니다. 비록을 사용하는 것과 똑같이 간단한 해결책이 있었으면 좋겠습니다. sort파일 디렉토리가 아닌 문자열 배열이있는 경우
Hubro

23
BSD / OSX에서이 옵션은 다른 것입니다 : -v - Force unedited printing of non-graphic characters.
kenorb

불행히도 -v 옵션은 AIX (6.1)에서 사용할 수 없습니다
bouvierr

6
이것이 가장 좋은 대답이어야합니다.
32r34wgf3e

1
MacOS의 경우이 기능이 작동하며 언급 된 옵션 만 찾을 수 없습니다.ls | sort -n
Ricky Levi

47

GNU ls (즉, Linux, Cygwin 또는 GNU ls가 특별히 설치된 기타 시스템) :

ls -v

zsh에서 :

echo *(n)

다른 껍질에서 :

echo log?.gz log??.gz log???.gz

교체 echo하여 printf '%s\n'별도의 행에 각 파일 이름을 원하는 경우.

파일 메타 데이터 ( ls -l)를 원하고 GNU가없는 경우 ls사전 식 순서로 보려는 각 파일 이름 또는 파일 이름 그룹에 대해 별도로 호출해야합니다 .

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

이러한 어려움을 피하려면 파일 이름에 선행 0을 충분히 사용하여 사전 편찬이 사람에게 친숙해 지도록하십시오 ( log001.gz등).


29

ls -1v이 특정 경우 에는 솔루션 이 가장 훌륭 sort하지만 원래 질문에서 와 같이 작동하는 것도 좋은 방법이라고 생각합니다 ls. 이 경우 다음을 사용할 수 있습니다.

ls -1 | sort -n -k1.4

-n옵션은 sort에 숫자로 정렬하도록 지시 -k 1.4하고 정렬 키를 4 번째 문자부터 마지막 ​​문자까지 첫 번째 필드 (이 경우 전체 파일 이름)로 설정합니다.


내 경우 ls -1 | sort -n -k1.4에는 작동하지 않습니다. 처음에는 정렬되지 않은 문자를 최대 4 자까지 제공 한 다음 4 번째 문자 이후에 정렬합니다. ls -1 |sort | sort -n -k1.4대신에 사용 했는데 완벽하게 작동했습니다.
Prabhu

3
@Prabhu 대신에 할 수 있습니다 sort -k1.1,1.3 -k1.4n. sort구현이 안정적 일 필요는 없으므로 접근 방식이 모든 구현에서 작동하지는 않습니다. -VGNU 및 FreeBSD 옵션 도 참조하십시오 sort.
Stéphane Chazelas

21

GNU sort(Linux에서 사용 가능)에는 숫자 이외의 숫자를 요청하는 방식으로 해석하는 "버전 정렬"모드가 있습니다.

보낸 사람 man 1 sort:

    -V, --version-sort
           natural sort of (version) numbers within text

(빈 테스트 파일을 만들기 나열하려면 다음
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz)

-V옵션 (또는 --version-sort)을 추가 한 사례 :

ls -1 log*.gz | sort -V
log1.gz
log2.gz
log3.gz
log99.gz
log100.gz
log101.gz
log102.gz


3

내 Solaris 버전은 ls -v(grrr)을 지원하지 않습니다 . 그리고 위에 제공된 정렬 솔루션은 파일 이름에서 자릿수 위치에 대한 지식이 필요하며 2) 여러 부분으로 된 버전 번호와 같은 것을 처리하지 않습니다.

아래의 접근 방식은 Solaris와 호환되며 숫자 위치를 알 필요가 없으며 2, 3 또는 4 개의 구성 요소 (예 : a-1.2, foo-5.6.7, bar_baz_9.10.11.12)로 버전 번호를 처리합니다. 또한 sort -f대문자와 소문자를 함께 접고 파일과 혼합 된 디렉토리를 올바르게 처리합니다.

ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n

이 버전은 첫 번째 구성 요소를 한 자리수로 제한합니다.

대상 운영 체제가 지원 ls -v하는 경우 분명히 탁월한 솔루션입니다.


1

펄 솔루션 :

ls log*.gz | perl -ne 'sub getnum{ $_[0] =~ /log(\d+)\.gz/; $1 }; push @A, $_; END{ print sort { getnum $a <=> $b } @A}'

1
$ ls
log101.gz  log102.gz  log103.gz  log104.gz  log105.gz  log106.gz  log10.gz  log1.gz
$ ls | sort -t . -n -k1.4
log1.gz
log10.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz

1
-t .여기에 불필요한입니다.
Stéphane Chazelas

0

이것은 나를 위해 일했습니다.

파일이 있습니다 1.jpg 2.jpg ... 18.jpg

$ echo *.jpg | tr -s ' ' '\n' | sort -n

sortls인쇄 할 수없는 색상 문자로 인해 출력 과 혼동되고 있습니다. 이것을 시도하면 :

ls -1 --color=none *.jpg | sort -n

완벽하게 작동합니다.

sort-i옵션으로 인쇄 할 수없는 문자를 무시할 수 있지만 여전히 작동하지 않으며 이유를 모르겠습니다.

그러나 항상 다음과 같이 색상을 제거 할 수 있으며 sort작동합니다.

ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n

언젠가 sort이것에 대한 옵션이 있기를 바랍니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.