it-swarm-vi.com

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

Làm thế nào để bạn sắp xếp du -sh /dir/* theo kích cỡ? Tôi đọc một trang web cho biết sử dụng | sort -n nhưng điều đó 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
209
xenoterracide

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 -h tùy chọn cho sort rằng đầu vào là định dạng có thể đọc được của con người (số có đơn vị; dựa trên 1024 để 1023 được coi là dưới 1K xảy ra khớp với what GNU du -h là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 .

Lưu ý:

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 gsort làm thay thế thả vào sort.

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

268
Shawn J. Goff

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 thực sự yêu cầu các đơn vị con người, 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
49
pboin

Nếu bạn không có phiên bản gần đây của GNU coreutils , bạn có thể gọi du mà không có -h Để 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 hậu xử lý. Điều này có lợi thế hoạt động ngay cả khi phiên bản du của bạn không có cờ -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}'

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

Nếu du của bạn có tùy chọn hiển thị kích thước theo byte (ví dụ: -b Hoặ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) , thêm khoảng trắng vào đầu s (tức là s=" kMGTEPYZ";) hoặc thêm if (x<1000) {return x} else {x/=1024} ở đầu hàm human.

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.

Nếu bạn không có sort -h bạn có thể làm được việc 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ố. Sed thứ ba chuyển đổi G thành Z để 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.

9
Shawn J. Goff

Trên OS X, bạn có thể cài đặt coreutils 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 -h tham số dòng lệnh.

6
Roland

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ó bằng 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
ddeimeke

Vì Mac OS X không có -h tùy chọn cho sort, vì vậy tôi đã thử và học sedawk cho 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 awk là mặc định awk (đó là nawk, vì cả awknawk trỏ đế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ụng du -skcx *

4
nonopolarity

Đâ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ư sự khét tiếng vịt từ "Linux Server Hacks "Của 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:

[email protected]:~ $ ducks
32M src
42M .cpan
43M .macports
754M    doc
865M    Work
1G  .Trash
4G  Library
17G Downloads
30G Documents
56G total

[email protected]:~ $
1
Stefan Lasiewski

Trong trường hợp không có GNU sort -h, cái 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 }'
1
friedl.otto

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
jaypal singh

Lệnh :

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

Giải thích :

  • 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

0
Rohan Ghige

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

du -sh * | sort -h
0
Meskan

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 -d hoặc là 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
Mark Crossfield

Đ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

0
user5337995

Đã 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 theo Gigabyte và nhỏ nhất trên Kilobytes.

0
Chuguniy