du 출력을 크기별로 어떻게 정렬합니까?


196

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


허용 된 답변 sort -h은 2017 년 8 월 우분투 16.04 LTS에서 나에게 도움이되었습니다. 먼저 cd /mnt(fstab에서 UUID에 의해 마운트 된) 드라이브를 찾습니다 . 그럼 않는 du >~/dumnt.out 다음 sort -h ~/dumnt.out >~/dumntsort.out나는 가장 큰 공간 돼지를보고`꼬리 ~ / dumntsort.out을 할 수 있습니다.
SDsolar

답변:


252

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기본적으로 지원 합니다.


27
참고 : -r상단에 큰 것을 원한다면 정렬에 추가
xenoterracide

9
OSX에 설치할 수 있습니다 coreutils통해 brew당신에 bin 폴더를 추가 PATH하여로 RC의 파일 및 -h사용할 수 있습니다.
kenorb

오, -r 알림에 감사합니다. 즉 tail, 돼지를 보라는 명령이 필요하지 않습니다 .
SDsolar

47

-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

2
필요한 결과를 얻기 위해 다른 것을 설치할 필요가 없습니다
taranaki

16

당신이하지 않은 경우 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 범위의 숫자에 대한 소수 자릿수 표시는 독자에게 연습으로 남습니다.


이것은 내가 리눅스와 맥 모두에서 작동하는 것으로 밝혀진 상자 솔루션 중 하나였습니다. 매우 감사합니다!
Brian Graham

9

없는 경우 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 접미사를 바꿉니다.


멋진 노력이지만 이것은 나를 위해 일하는 것에 가깝지 않습니다.
jvriesem

6

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

brew install coreutils

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


4

이 작은 펄 스크립트는 트릭을 수행합니다. 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;

4

맥 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 *


1

Ubuntu 10.04, CentOS 5.5, FreeBSD 및 Mac OS X에서 사용하는 내용은 다음과 같습니다.

나는에서 아이디어를 빌려 www.geekology.co.za/earthinfo.org 뿐만 아니라 악명 높은 오리 라일리에 의해 "리눅스 서버 해킹"에서합니다. 나는 여전히 내 필요에 적응하고 있습니다. 이것은 여전히 ​​진행중인 작업입니다 (현재 아침 기차 에서이 작업을하고있었습니다).

#! /usr/bin/env bash
ducks () {
    du -cks -x | sort -n | while read size fname; do
        for unit in k M G T P E Z Y; do
            if [ $size -lt 1024 ]; then
                echo -e "${size}${unit}\t${fname}"
                break
            fi
            size=$((size/1024))
        done
    done
}
ducks > .ducks && tail .ducks

출력은 다음과 같습니다.

stefan@darwin:~ $ ducks
32M src
42M .cpan
43M .macports
754M    doc
865M    Work
1G  .Trash
4G  Library
17G Downloads
30G Documents
56G total

stefan@darwin:~ $

내 생각 엔 du -cks -x *? (별표 포함)
nopole April

이 사용법에서는 별표가 중복됩니다. 시도 해봐.
Stefan Lasiewski

당신은라는 파일에 코드의 첫 번째 세트를 넣어 의미합니까 ducks, 다음 chmod a+x ducks을 누른 후, ./ducks그것을 실행? 그런 다음 Mac OS X과 Ubuntu 2014-10에서 총 디스크 사용량 만 볼 수 있습니다. 나는 또한 퍼팅 시도 ducks() { ...}로 정의를 .bashrc사용하여 다음과 ducks그것을 실행, 및 Mac OS X에서 같은 일 만 총합계를 참조
nopole

1

이 스크립트로 미치십시오-

$du -k ./* | 
> sort -nr |
> awk '
> {split("KB,MB,GB",size,",");}
> {x = 1;while ($1 >= 1024) {$1 = $1 / 1024;x = x + 1} $1 = sprintf("%-4.2f%s", $1, size[x]); print $0;}'

1

GNU가 없으면 sort -h대부분의 UNIX 환경에서 작동합니다.

join -1 2 -2 2 <(du -sk /dir/* 2>/dev/null | sort -k2,2) <(du -sh /dir/* 2>/dev/null | sort -k2,2) | sort -nk2,2 | awk '{ print $3 "\t" $1 }'

0

이것은 공백이나 아포스트로피가있는 파일 이름을 처리하며 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

0

이렇게하면 출력이 크기의 내림차순으로 정렬됩니다.

du -sh /var/* | sort -k 1rn

그러면 출력이 크기 순서대로 증가합니다.

du -sh /var/* | sort -k 1n

추신 : 이것은 모든 열을 기준으로 정렬하는 데 사용할 수 있지만 열 값은 동일한 형식이어야합니다


1
번호 sort -k1rnsort -rn각 줄의 초기 10 진수 시퀀스를 기준으로하여 숫자 순으로 정렬됩니다. 그것은 부동 소수점 이해하지 않고, 그것을 이해하지 못하는 k, M, G... 접미사를. 10.1k는 1.23G보다 큰 것으로 간주됩니다
Stéphane Chazelas

0

Solaris에서 테스트되었습니다!

du -kh | sort -nk1 | grep [0-9]K && du -kh | sort -nk1 | grep [0-9]M && du -kh | sort -nk1 | grep [0-9]G

이것은 모든 디렉토리 크기를 재귀 적으로 출력하며, 맨 아래는 기가 바이트에서 가장 큰 디렉토리이고 가장 작은 것은 킬로바이트입니다.



0

명령:

du -ah . | sort -k1 -h | tail -n 50

설명:

  • 현재 디렉토리에있는 모든 파일 / 폴더의 크기를 사람이 읽을 수있는 형식으로 재귀 적으로 나열합니다.

du -ah .

  • 첫 번째 열에있는 사람이 읽을 수있는 크기를 정렬하고 최대 50을 유지하십시오.

sort -k1 -h | tail -n 50


-1

크기를 MB 단위로 정렬하려면

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

사용자는 du -h(사람이 읽을 수있는 출력) 출력을 숫자로 정렬 하려고합니다 . 당신은 그것에 대한 답변을 제공하지 않습니다. UNIX-SE 계정을 다른 SE 사이트에있는 다른 계정과 연결할 수도 있습니다.
Tonin

-2

이 스크립트는 훨씬 쉽다 :

for i in G M K; do du -h -d1 / | grep [0-9]$i | sort -n; done

-2

OSX 용

du -h -k  {PATH} | sort -n

-k단순히 취소 하는 것이 아니라면 -hOP에서 요청한 사람이 읽을 수있는 출력을 어떻게 제공할까요?
Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.