ls 및 사람의 숫자로 정렬

ls 및 사람의 숫자로 정렬

나는 디렉토리를 생성한다 mkdir site_{1..44}. 정렬하고 싶어요

site_1
site_2
site_3
site_4
...
site_44

나는 명령을 실행 ls | sort -h하고

site_1
site_10
site_11
site_12
site_13
site_14
site_15
site_16
site_17
site_18
site_19
site_2
site_20
site_21
site_22
site_23
site_24
site_25
site_26
site_27
site_28
site_29
site_3
site_30
site_31
site_32
site_33
site_34
site_35
site_36
site_37
site_38
site_39
site_4
site_40
site_41
site_42
site_43
site_44
site_5
site_6
site_7
site_8
site_9

내가 어디서 잘못됐나요?

답변1

GNU 사용 ls:

ls -1 -v
ls --format=single-column --sort=version

GNU 사용 sort(그리고 파일 이름에 개행 문자가 포함되어 있지 않다고 가정):

ls | sort -V
ls | sort --version-sort

를 사용하면 zshglob 한정자를 사용하여 숫자로 glob을 정렬할 수도 있습니다 n.

print -rC1 -- *(Nn)

(여기서 ullglob 한정자가 사용되므로 N일치하는 파일이 없으면( *패턴으로 숨겨지지 않은 파일이 없는 경우) 오류를 발생시키는 대신 아무것도 인쇄하지 않습니다.)

에 전달된 경우 자체 정렬을 비활성화하도록 ls지시해야 합니다 ( / GNU 사용 ).ls-U--sort=nonels

ls -ldU -- *(n)

N( 인수가 전달되지 않으면 아무 것도 나열 ls되지 않으므로 여기서는 사용되지 않습니다 ..)

Make it the default 를 사용할 수도 있습니다 set -o numericglobsort.

하지만 더 나은 접근 방식은 파일 이름에 0 패딩을 사용하여 숫자와 어휘가 동일하게 정렬되도록 하는 것입니다.

mkdir site_{01..44}    # zsh, bash, yash -o braceexpand
mkdir site_{1..44%02d} # ksh93

GNU sort -h자체가 정렬되어 있습니다.사람이 읽을 수 있는 크기As du -h또는 ls -shexample이 표시된 곳에서는 123456789example이 로 표현되므로 118M여기서는 소용이 없습니다.

귀하의 경우에는 site_1... 보이는 것부터 시작하지 마십시오사람이 읽을 수 있는 크기, 둘 다 0으로 처리되고 동일하게 정렬됩니다. 그러나 마지막 비교로 인해 전체 행을 어휘적으로 비교하여 연결을 끊는 어휘 정렬이 수행됩니다.

디렉토리 이름이 지정되어 있고 나중에 찾은 크기에 따라 정렬하려는 경우에도 site_314해당 디렉토리 site_1.1K가 어디에 있는지 알려 주어야 합니다.site_0.9M_sort사람이 읽을 수 있는 크기sort -t_ -k1,1 -k2h첫 번째 어휘 앞의 부분을 먼저 정렬 _한 다음 그 뒤의 부분을 정렬하여 _다음과 같이 해석하는 것과 같습니다 .사람이 읽을 수 있는 크기hey 사양을 준수 하는 로고가 포함되어 있습니다 k.

관련 정보