du 출력을 크기별로 어떻게 정렬합니까? 분명히 맞지 않습니다. 여기에 잘못된 예가 있습니다. [~]#

du -sh /dir/*크기별로 어떻게 정렬 합니까? 나는 사용을 말한 사이트를 읽었 | sort -n지만 분명히 맞지 않습니다. 여기에 잘못된 예가 있습니다.

[~]# du -sh /var/* | sort -n
0       /var/mail
1.2M    /var/www
1.8M    /var/tmp
1.9G    /var/named
2.9M    /var/run
4.1G    /var/log
8.0K    /var/account
8.0K    /var/crash
8.0K    /var/cvs
8.0K    /var/games
8.0K    /var/local
8.0K    /var/nis
8.0K    /var/opt
8.0K    /var/preserve
8.0K    /var/racoon
12K     /var/aquota.user
12K     /var/portsentry
16K     /var/ftp
16K     /var/quota.user
20K     /var/yp
24K     /var/db
28K     /var/empty
32K     /var/lock
84K     /var/profiles
224M    /var/netenberg
235M    /var/cpanel
245M    /var/cache
620M    /var/lib
748K    /var/spool


답변

GNU coreutils (대부분의 Linux 배포판에서 일반적 임)가있는 경우

du -sh -- * | sort -h

-h옵션은 sort입력이 사람이 읽을 수있는 형식 (단위를 포함하는 숫자; 1024 기반)으로 1023이 1K 미만으로 간주되어 GNU와 일치하는 것으로 간주 du -h합니다.

이 기능 은 2009 년 8 월 GNU Core Utilities 7.5에 추가되었습니다 .

노트 :

이전 버전의 Mac OSX를 사용하는 경우을 사용하여 coreutils를 설치 brew install coreutils한 다음 gsort드롭 인 대체로 사용하십시오 sort.

최신 버전의 macOS (Mojave에서 확인)는 sort -h기본적으로 지원 합니다.


답변

-k 플래그를 사용하여 사람이 읽을 수있는 1K 블록을 계산하십시오. 그런 다음 공통 단위를 가지며 숫자 정렬을 쉽게 수행 할 수 있습니다.

du -ck | sort -n

인간 단위를 명시 적으로 요구하지는 않지만 그렇게했다면 그렇게 할 수있는 방법이 많이 있습니다. 많은 사람들이 위의 1K 블록 기술을 사용한 다음 du를 다시 호출합니다.

https://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

추가 된 KB 단위를 보려면 다음을 사용하십시오.

du -k | sed -e 's_^\([0-9]*\)_\1 KB_' | sort -n

답변

당신이하지 않은 경우 GNU의로 coreutils의 최신 버전을 , 당신은 호출 할 수 du없이 -h정렬 출력을 얻기 위해, 그리고 약간의 후 처리로 인간 친화적 인 출력을 생성합니다. 버전에 플래그 du가없는 경우에도 작동하는 이점이 있습니다 -h.

du -k | sort -n | awk '
    function human(x) {
        if (x<1000) {return x} else {x/=1024}
        s="kMGTEPZY";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {gsub(/^[0-9]+/, human($1)); print}'

SI 접미사 (즉, 1024가 아닌 1000의 배수)를 원하는 경우 while루프 본문 에서 1024를 1000으로 변경하십시오 . (조건에서 1000이 의도 된 것이므로, 예를 들어 1M보다는 오히려 얻을 수 1000k있습니다.)

귀하의 경우 du(예 : 바이트 크기를 표시 할 수있는 옵션이 -b-B 1-이 오히려 디스크 사용량에 비해 실제 파일 크기를 계산하는 부작용이있을 수 있습니다)를,의 시작 부분에 공간을 추가 s(예 s=" kMGTEPYZ";) 또는 추가 if (x<1000) {return x} else {x/=1024}의 시작 부분에 human기능.

1-10 범위의 숫자에 대한 소수 자릿수 표시는 독자에게 연습으로 남습니다.


답변

없는 경우 sort -h다음을 수행하십시오.

du -sh * | sed 's/\([[:digit:]]\)\t/\1B\t/' | sed 's/\(.\t\)/\t\1/' | sed 's/G\t/Z\t/' | sort -n -k 2d,2 -k 1n,1 | sed 's/Z\t/G\t/'

이것은 du 목록을 가져 와서 접미사를 분리하고 그것을 사용하여 정렬합니다. <1K의 접미사가 없기 때문에 첫 번째 sed는 B (바이트)를 추가합니다. 두 번째 sed는 숫자와 접미사 사이에 구분 기호를 추가합니다. 세 번째 sed는 G보다 Z를 변환하여 M보다 큽니다. 테라 바이트 파일이 있으면 G를 Y로, T를 Z로 변환해야합니다. 마지막으로 두 열을 기준으로 정렬 한 다음 G 접미사를 바꿉니다.


답변

OS X에서는 Homebrew 를 통해 필요한 coreutils를 설치할 수 있습니다 .

brew install coreutils

이를 통해 명령 줄 매개 변수 gsort가 포함 된을 갖게 -h됩니다.


답변

이 작은 펄 스크립트는 트릭을 수행합니다. duh(또는 원하는대로) 저장하고duh /dir/*

#!/usr/bin/perl -w
use strict;

my @line;

sub to_human_readable {
        my ($number) = @_;
        my @postfix = qw( k M G T P );
        my $post;
        my $divide = 1;
        foreach (@postfix) {
                $post = $_;
                last if (($number / ($divide * 1024)) < 1);
                $divide = $divide * 1024;
        }
        $number = int($number/$divide + 0.5);
        return $number . $post;
}

sub trimlengthright {
        my ($txt, $len) = @_;
        if ( length($txt) >= $len ) {
                $txt = substr($txt,0,$len - 1) . " ";
        } else {
                $txt = $txt . " " x ($len - length($txt));
        }
        return $txt;
}

sub trimlengthleft {
        my ($txt, $len) = @_;
        if ( length($txt) >= $len ) {
                $txt = substr($txt,0,$len - 1) . " ";
        } else {
                $txt = " " x ($len - length($txt)) . $txt;
        }
        return $txt;
}

open(DF,"du -ks @ARGV | sort -n |");
while (<DF>) {
        @line = split;
        print &trimlengthleft(&to_human_readable($line[0]),5)," "; # size
        print &trimlengthright($line[1],70),"\n"; # directory
}
close DF;

답변

맥 OS X가 없기 때문에 -h에 대한 옵션을 sort, 그래서 시도하고 배운 sedawk첫 번째 시도에 대한 :

du -sk * | sort -g | awk '{ numBytes = $1 * 1024; numUnits = split("B K M G T P", unit); num = numBytes; iUnit = 0; while(num >= 1024 && iUnit + 1 < numUnits) { num = num / 1024; iUnit++; } $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]); print $0; }'

긴 줄입니다. 확장하면 다음과 같습니다.

du -sk * | sort -g | awk '{

    numBytes = $1 * 1024;
    numUnits = split("B K M G T P", unit);
    num = numBytes;
    iUnit = 0;

    while(num >= 1024 && iUnit + 1 < numUnits) {
        num = num / 1024;
        iUnit++;
    }

    $1 = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]);
    print $0;

}'

나는와 맥 OS X 매버릭스, 요세미티, 우분투 2014-04에 그것을 시도 awk기본 인 awk(인 nawk모두 있기 때문에, awknawk지점 /usr/bin/mawk또는 둔한), 그들은 모두했다.

다음은 Mac에서의 출력 샘플입니다.

     0B  bar
     0B  foo
   4.0K  wah
  43.0M  Documents
   1.2G  Music
   2.5G  Desktop
   4.7G  Movies
   5.6G  VirtualBox VMs
   9.0G  Dropbox
  11.7G  Library
  21.2G  Pictures
  27.0G  Downloads

대신 du -sk *@Stefan의 답변에서 총계가 표시되는 곳에서 파일 시스템 마운트 포인트를 통과하지 않고 다음을 사용하여 보았습니다.du -skcx *