사람이 읽을 수있는 파일 크기 정렬


16

사람이 읽을 수있는 파일 크기 정렬, 크기 식별자 (G, M, K)를 고려한 숫자 정렬을 사용하여 목록을 정렬하려면 어떻게해야합니까? du -sh예를 들어 " "출력을 정렬 할 수 있습니까 ?

문제점 : 파일 / 폴더를 나열하고 크기별로 정렬하는 문제를 고려하십시오. 다음을 실행하여이를 달성 할 수 있습니다.

du -s * | sort -n

파일 / 폴더를 크기별로 정렬하여 나열합니다. 그러나 인쇄 된 크기 값은 바이트 단위 (또는 선택한 경우 메가 바이트 또는 기가 바이트)입니다.

사람이 읽을 수있는 값을 기준으로 정렬 할 수 있으므로 비슷한 것을 실행할 수 있습니다.

du -sh * | <human-readable file sort>

2.0M 이후에 1.5GB 폴더가 표시됩니다.

답변:



29

GNU coreutils> = 7.5를 사용하십시오.

du -hs * | 정렬 -h

(이 서버 오류 질문 에서 가져옴 )

맨 페이지

편집 : GNU 버전을 사용 du --version하고 sort --version있는지 여부를 사용하여 버전을 확인할 수 있습니다 . homebrew를 사용하는 경우 gdu및 을 사용해야 gsort합니다.


8
OSX에는이 옵션이 없습니다. homebrew를 사용하여 brew install coreutils모든 coreutils 명령 앞에 'g'를 붙일 수 있습니다 . 그런 다음 할 수 있습니다 gdu -hs * | gsort -h.
dsummersl

1
@dsummersl의 요점을 명확히하기 위해 : du -hs *Mac OS X에서 잘 작동하지만을 sort -h반환합니다 sort: invalid option -- h. 여기에 설명 된대로 MacPorts를 통해 coreutils 패키지를 설치할 수도 있습니다 .
jvriesem

3

1MB보다 큰 파일이 걱정되는 경우이 명령을 사용하여 파일을 정렬하고 awk를 사용하여 크기를 MB로 변환 할 수 있습니다.

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

또한 크기를 가장 가까운 MB로 반올림합니다. 원하는 단위로 변환하여 수정할 수 있습니다.


이것은 다음과 유사합니다 du -sm * | sort -n.. -s/는 -gdu메가 바이트 / 기가 바이트의 출력 크기를.
notnoop

MB의 경우 1024로 더 나누어야합니다. 그렇게 될 것입니다int($1 / (1024 * 1024))
Pratik Khadloya

2

이것은 공백이나 아포스트로피가있는 파일 이름을 처리하며 xargs -d또는 sort -h다음을 지원하지 않는 시스템에서 작동합니다 .

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

결과 :

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

다른 하나는 다음과 같습니다.

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

당신은해야 할 수도 있습니다

$ cpan Number::Bytes::Human

먼저.


1

du -sk * | 정렬 -n | awk '{print $ 2}'| f를 읽는 동안; du -sh "$ f"수행; 끝난


1

이 명령은 크기를 MB 단위로 정렬합니다

du --block-size=MiB --max-depth=1 path | sort -n

그것은 이미 사용자가 실제로하고있는 일이며, MiB로 예제를 제공하지 않았지만 그것에 대해 언급했습니다. 원하는 것은 -h깃발을 du로 사용할 때 정렬 할 수있는 것 입니다.
Tonin

0

MB와 GB를 동일한 출력으로 결합 한 다른 것을 정렬하려고 시도했기 때문에 여기에서 끝내서 제어 할 수 없었습니다.

$NF#GB또는 #MB패턴이 출력의 마지막 열 이므로 사용됩니다 .

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

awk 명령에 대한 설명 :

if ($NF ~ /[0-9\.]+GB/)

마지막 열이 숫자 나 한 .번 이상 포함 된 정규식 패턴과 일치하는 경우GB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

그런 다음 변수 a를 각 줄의 숫자 부분으로 설정하십시오. 이는 마지막 열의 동일한 정규식 패턴과 일치합니다 ( $NF)

printf "%sMB\n", a*1024} \

설정 후 a, 사용 printf으로 출력 포맷${a*1024}MB

else {print $NF}

그렇지 않으면 마지막 열을 인쇄하십시오.

sort -n

출력에서 숫자 정렬을 사용하십시오.


echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

정규식 패턴을 재사용 할 수있는 방법이 있다고 확신하므로 한 번만 매치를 수행하고 교체 할 수는 있지만 아직 방법을 모르겠습니다. :)

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