사람이 읽을 수 있는 크기로 정렬하는 방법

사람이 읽을 수 있는 크기로 정렬하는 방법

기본적으로 파일을 찾은 다음 크기별로 정렬합니다. 사람이 읽을 수 있는 크기로 크기를 정렬하지 않으면 스크립트가 작동합니다. 하지만 저는 사람이 읽을 수 있는 크기를 원합니다. 사람이 읽을 수 있는 크기를 정렬하는 방법은 무엇입니까?

예를 들어:

 ls -l | sort -k 5 -n | awk '{print $9 " " $5}'

이것은 예상대로 작동하며 내 파일 크기는 오름차순 바이트 순서입니다.

1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850

이제 사람이 읽을 수 있는 크기를 원하므로 ls에 -h 매개변수를 추가했는데 이제 일부 파일의 순서가 잘못되었습니다.

 ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K

답변1

노력하다sort -h k2

-h, --human-numeric-sort 사람이 읽을 수 있는 숫자를 비교합니다(예: 2K 1G)

Gnu 정렬, BSD 정렬 등의 일부입니다.

답변2

ls이 기능은 내장되어 있습니다. 이 -S옵션을 사용하여 역순으로 정렬하세요.ls -lShr

       -r, --reverse
              reverse order while sorting

       -S     sort by file size, largest first

답변3

특정 쉘이 언급되지 않았으므로 zsh쉘에서 모든 작업이 수행되는 방법은 다음과 같습니다.

ls -lhf **/*(.Lk-1024oL)

glob 패턴은 pathname 에서 와 **유사하게 *일치합니다 /. 즉, 재귀 검색과 같습니다.

ls명령은 사람이 읽을 수 있는 크기를 활성화 -h하고 긴 목록 출력 형식을 활성화합니다 -l. 이 -f옵션은 정렬을 비활성화하므로 ls파일은 지정된 순서대로만 나열됩니다.

**/*(.Lk-1024oL)이 순서는 작은 파일이 먼저 나열되도록 파일 이름 와일드카드 패턴으로 정렬됩니다 . 이 **/*비트는 이 디렉터리와 그 아래 디렉터리에 있는 모든 파일과 디렉터리와 일치하지만 (...)glob의 동작을 수정합니다("glob 한정자"입니다).

oL마지막( )은 o파일 크기("길이")를 기준으로 이름을 정렬합니다.L

접두어를 사용 .하면 glob이 일반 파일(디렉토리 없음)만 일치하게 됩니다.

Lk-1024비트는 크기가 1024KB 미만인 파일을 선택합니다("1024KB 미만의 길이").

zsh이것이 기본 대화형 쉘이 아닌 경우 다음을 사용할 수 있습니다.

zsh -c 'ls -lf **/*(.Lk-1024oL)'

setopt GLOB_DOTS숨겨진 이름은 (또는 )을 사용하여 zsh -o GLOB_DOTS -c ...일치시킬 수도 있습니다 . ...또는 그냥 Dglob 한정자 문자열에 추가하세요.


numfmt위 내용을 확장하여 경로 이름과 사람이 읽을 수 있는 크기가 포함된 2열 출력을 원하고 GNU coreutils의 출력 도 있다고 가정하면 ,

zmodload -F zsh/stat b:zstat

for pathname in **/*(.Lk-1024oL); do
    printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done

아니면 더 빠르게,

paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
      <( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )

답변4

이것이 작동할까요?

ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t

첫 번째 awkexp는 1M보다 작은 파일을 찾고, 두 번째 exp는 결과에서 바이트 크기를 가져와 이를 KB로 변환하고 처음 3개 요소를 인쇄하여 사람이 읽을 수 있는 크기를 제공합니다.

관련 정보