Làm thế nào để bạn sắp xếp đầu ra du theo kích thước?


196

Làm thế nào để bạn sắp xếp du -sh /dir/*theo kích thước? Tôi đã đọc một trang web cho biết sử dụng | sort -nnhưng rõ ràng là không đúng. Đây là một ví dụ sai.

[~]# 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


Câu trả lời được chấp nhận sort -hđã làm việc cho tôi trong Ubuntu 16.04 LTS vào tháng 8 năm 2017. Đầu tiên tôi tìm thấy ổ đĩa được gắn kết của mình bằng cd /mnt(được gắn bởi UUID trong fstab). Sau đó, tôi làm du >~/dumnt.out sau sort -h ~/dumnt.out >~/dumntsort.outđó tôi có thể làm `tail ~ / dumntsort.out để xem những con lợn không gian lớn nhất.
SDsolar

Câu trả lời:


252

Nếu bạn có GNU coreutils (phổ biến trong hầu hết các bản phân phối Linux), bạn có thể sử dụng

du -sh -- * | sort -h

Các -htùy chọn nói sortrằng các đầu vào là định dạng con người có thể đọc được (số với đơn vị; 1024 dựa để 1023 được coi là ít hơn 1K đó xảy ra để phù hợp với những gì GNU du -hlàm).

Tính năng này đã được thêm vào GNU Core Utility 7.5 vào tháng 8 năm 2009 .

Ghi chú:

Nếu bạn đang sử dụng phiên bản cũ hơn của Mac OSX, bạn cần cài đặt coreutils với brew install coreutils, sau đó sử dụng gsortlàm thay thế thả xuống sort.

Các phiên bản mới hơn của macOS (đã được xác minh trên Mojave) hỗ trợ sort -hnguyên bản.


27
lưu ý: thêm -rvào sắp xếp, nếu bạn muốn những cái lớn ở đầu
xenoterracide

9
Trên OSX, bạn có thể cài đặt coreutilsqua brewvà thêm thư mục bin PATHvào tệp RC của bạn và -hnên có sẵn.
kenorb

Oh - cảm ơn bạn đã nhắc nhở -r. điều đó có nghĩa là tôi không cần taillệnh để xem những con lợn.
SDsolar

47

Hãy thử sử dụng cờ -k để đếm các khối 1K trong khi sử dụng có thể đọc được. Sau đó, bạn có một đơn vị chung và có thể dễ dàng thực hiện sắp xếp số.

du -ck | sort -n

Bạn không yêu cầu đơn vị con người một cách rõ ràng, nhưng nếu bạn đã làm, thì có rất nhiều cách để làm điều đó. Nhiều người dường như sử dụng kỹ thuật khối 1K ở trên, và sau đó thực hiện cuộc gọi thứ hai đến du.

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

Nếu bạn muốn xem các đơn vị KB được thêm vào, hãy sử dụng:

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

2
Rất vui khi không phải cài đặt một cái gì đó khác để có được kết quả tôi cần
taranaki

16

Nếu bạn không có phiên bản GNU coreutils gần đây , bạn có thể gọi dumà không -hnhận được đầu ra có thể sắp xếp và tạo đầu ra thân thiện với con người với một chút xử lý hậu kỳ. Điều này có lợi thế làm việc ngay cả khi phiên bản của dubạn không có -hcờ.

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}'

Nếu bạn muốn hậu tố SI (tức là bội số của 1000 chứ không phải 1024), hãy thay đổi 1024 thành 1000 trong whilethân vòng lặp. (Lưu ý rằng 1000 trong điều kiện được dự định, để bạn nhận được ví dụ 1Mchứ không phải 1000k.)

Nếu bạn ducó tùy chọn hiển thị kích thước theo byte (ví dụ -bhoặc -B 1- lưu ý rằng điều này có thể có tác dụng phụ là đếm kích thước tệp thực tế thay vì sử dụng đĩa), hãy thêm khoảng trắng vào đầu s(ví dụ s=" kMGTEPYZ";) hoặc thêm if (x<1000) {return x} else {x/=1024}vào đầu các humanchức năng.

Hiển thị một chữ số thập phân cho các số trong phạm vi 1 Hay10 là một bài tập cho người đọc.


Đây là một trong những giải pháp vượt trội mà tôi thấy là hoạt động trên cả linux và mac. Cảm ơn rất nhiều!
Brian Graham

9

Nếu bạn không có sort -hbạn có thể làm điều này:

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/'

Điều này nhận được danh sách du, tách hậu tố và sắp xếp bằng cách sử dụng đó. Vì không có hậu tố cho <1K, nên sed đầu tiên thêm B (cho byte). Sed thứ hai thêm một dấu phân cách giữa chữ số và hậu tố. Chiếc sed thứ ba chuyển đổi G thành Z sao cho nó lớn hơn M; nếu bạn có tệp terabyte, bạn sẽ phải chuyển đổi G thành Y và T thành Z. Cuối cùng, chúng tôi sắp xếp theo hai cột, sau đó chúng tôi thay thế hậu tố G.


Nỗ lực tuyệt vời, nhưng điều này không đến gần để làm việc cho tôi.
jvriesem

6

Trên OS X, bạn có thể cài đặt các lõi cần thiết thông qua Homebrew :

brew install coreutils

Với điều này, bạn sẽ có gsort, bao gồm -htham số dòng lệnh.


4

Kịch bản Perl nhỏ này thực hiện các mẹo. Lưu nó dưới dạng duh(hoặc bất cứ điều gì bạn muốn) và gọi nó vớiduh /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

Vì Mac OS X không có -htùy chọn cho sortnên tôi đã thử và học sedawkcho lần thử đầu tiên:

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; }'

nó là một hàng dài Mở rộng, đó là:

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; 

}'

Tôi đã thử nó trên Mac OS X Mavericks, Yosemite, Ubuntu 2014-04 với awkmặc định awk(đó là nawkvì cả hai awknawktrỏ đến /usr/bin/mawk) hoặc gawk, và tất cả đều hoạt động.

Đây là một mẫu đầu ra trên máy 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

thay vì du -sk *, tôi đã thấy trong câu trả lời của @ Stefan, nơi tổng số lớn cũng được hiển thị và không đi qua bất kỳ điểm gắn kết hệ thống tệp nào, bằng cách sử dụngdu -skcx *


1

Đây là những gì tôi sử dụng trên Ubuntu 10.04, CentOS 5.5, FreeBSD và Mac OS X.

Tôi mượn ý tưởng từ www.geekology.co.za/earthinfo.org , cũng như khét tiếng vịt từ "Linux Server Hacks" bởi O'Reilly. Tôi vẫn đang thích ứng nó với nhu cầu của tôi. Đây vẫn là một công việc đang tiến triển (Như trong, tôi đã làm việc này trên tàu sáng nay.):

#! /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

Đây là đầu ra:

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:~ $

Tôi nghĩ bạn có ý du -cks -x *gì? (có dấu hoa thị)
nopole

Dấu hoa thị là dư thừa trong việc sử dụng này. Hãy thử một lần.
Stefan Lasiewski

bạn có nghĩa là đặt bộ mã đầu tiên vào một tệp được gọi ducks, và sau chmod a+x ducksđó sử dụng ./ducksđể chạy nó? Sau đó, tôi chỉ thấy tổng mức sử dụng đĩa, trên cả Mac OS X và trên Ubuntu 2014-10. Tôi cũng đã thử đưa ducks() { ...}định nghĩa vào .bashrcvà sau đó sử dụng ducksđể chạy nó, và điều tương tự trên Mac OS X, chỉ thấy tổng số lớn
nopole

1

Phát điên với kịch bản này -

$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

Trong trường hợp không có GNU sort -h, điều này sẽ hoạt động trong hầu hết các môi trường 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

Cái này xử lý tên tệp với khoảng trắng hoặc dấu nháy đơn và hoạt động trên các hệ thống không hỗ trợ xargs -dhoặc sort -h:

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

kết quả là:

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

0

Điều này sẽ sắp xếp đầu ra theo thứ tự giảm kích thước:

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

Điều này sẽ sắp xếp đầu ra theo thứ tự tăng kích thước:

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

PS: điều này có thể được sử dụng để sắp xếp theo bất kỳ cột nào nhưng các giá trị cột đó phải ở cùng định dạng


1
Số sort -k1rntương đương sort -rnvà chỉ sắp xếp số dựa trên chuỗi chữ số thập phân ban đầu trên mỗi dòng. Nó không hiểu dấu chấm động, và nó không hiểu được k, M, G... hậu tố. 10,1k sẽ được coi là lớn hơn 1,23G
Stéphane Chazelas

0

Đã thử nghiệm trên 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

Điều này sẽ xuất ra tất cả các kích thước thư mục theo cách đệ quy, ở phía dưới sẽ là thư mục lớn nhất tính bằng Gigabyte và ở mức nhỏ nhất trên Kilobytes.


0

Lớn nhất là ở dưới cùng:

du -sh * | sort -h

0

Chỉ huy:

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

Giải trình:

  • Danh sách kích thước của tất cả các tệp / thư mục đệ quy trong thư mục hiện tại ở dạng người có thể đọc được

du -ah .

  • Sắp xếp kích thước có thể đọc được của con người có trong cột đầu tiên và giữ 50 lớn nhất

sort -k1 -h | tail -n 50


-1

Để sắp xếp theo kích thước tính bằng MB

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

Người dùng muốn có được đầu ra của du -h(đầu ra có thể đọc được của con người) được sắp xếp theo số lượng. Bạn không cung cấp câu trả lời cho điều đó. Bạn cũng có thể muốn liên kết tài khoản UNIX-SE của mình với các tài khoản khác bạn có trên các trang SE khác.
Tonin

-2

Kịch bản này thậm chí còn dễ dàng hơn:

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

-2

cho OSX

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

không phải -klà hủy bỏ -hvà nếu vậy thì điều này cung cấp đầu ra có thể đọc được của con người theo yêu cầu của OP.
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.