Du çıktısını boyuta göre nasıl sıralarsınız?


196

Boyuta du -sh /dir/*göre nasıl sıralarsınız ? Kullanımı söylenen bir siteyi okudum | sort -nama bu kesinlikle doğru değil. İşte yanlış bir örnek.

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

3
Bunu daha önce gördüğümü biliyordum . En yüksek oyu alan cevap çok iyi değil ama diğerleri daha iyi .
Gilles

Kabul edilen cevap sort -hbenim için Ağustos 2017'de Ubuntu 16.04 LTS'de işe yaradı. İlk önce monte edilmiş sürücümü buldum cd /mnt(fstab'ta UUID tarafından monte edilmiş). Sonra yapıyorum du >~/dumnt.out sonra da sort -h ~/dumnt.out >~/dumntsort.outen büyük uzay domuzlarını görmek için kuyruğu ~ / dumntsort.out yapabilirim.
SDsolar

Yanıtlar:


252

GNU coreutils'iniz varsa (çoğu Linux dağıtımında ortak),

du -sh -- * | sort -h

Bu -hseçenek sort, girişin insan tarafından okunabilir bir format olduğunu söyler (birim sayısı; 1024 tabanlı, böylece 1023 1 GN'den az olan GNU'nun du -hyaptığı ile eşleşir ).

Bu özellik Ağustos 2009'da GNU Core Utilities 7.5'e eklendi .

Not:

Mac OSX eski bir sürümünü kullanıyorsanız, sizinle coreutils yüklemeniz gerekir brew install coreutils, daha sonra kullanmak gsortve açılan yerine olarak sort.

MacOS'un yeni sürümleri (Mojave'da doğrulandı) sort -hyerel olarak desteklenir.


27
not: -rüste büyük olanları istiyorsanız, sıralamaya ekleyin
xenoterracide

9
OSX sitesinde yükleyebilirsiniz coreutilsaracılığı brewile Blogunuza bin klasör eklemek PATHiçin içine rc dosyası ve -hkullanılabilir olmalıdır.
kenorb

Oh - -r hatırlattığın için teşekkürler. bu taildomuzları görmek için komuta ihtiyacım olmadığı anlamına geliyor .
SDsolar

47

İnsan tarafından okunabilir kullanım yerine 1K blokları saymak için -k bayrağını kullanmayı deneyin. Ardından, ortak bir birime sahipsiniz ve kolayca sayısal bir sıralama yapabilirsiniz.

du -ck | sort -n

Açıkça insan birimlerine ihtiyaç duymuyorsun, ama yaptıysan, bunu yapmanın bir sürü yolu var. Birçoğu yukarıdaki 1K blok tekniğini kullanıyor ve ardından du'ya ikinci bir çağrı yapıyor gibi görünüyor.

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

Eklenen KB birimlerini görmek istiyorsanız, şunu kullanın:

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

2
İhtiyacım olan sonuçları elde etmek için başka bir şey yüklemek zorunda kalmamak güzel
taranaki

16

Eğer bir yoksa GNU coreutils son sürümünü , Arayabileceğin duolmadan -hsıralanabilir çıkışını almak için ve biraz postprocess insan dostu çıktı üretir. Bu, sürümünüzün bayrağı duolmasa bile çalışma avantajına sahiptir -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 soneklerini istiyorsanız (yani, 1024 yerine 1000'in katları), whiledöngü gövdesinde 1024 ila 1000'i değiştirin . (Durumdaki 1000'in amaçlandığını unutmayın; örneğin, örneğin 1Myerine 1000k).

duBoyutları bayt cinsinden gösterme seçeneğiniz varsa (örneğin -bveya -B 1- bunun bunun disk kullanımı yerine gerçek dosya boyutlarını saymanın yan etkisine sahip olabileceğini unutmayın), s(' s=" kMGTEPYZ";)' ın başına bir boşluk ekleyin veya if (x<1000) {return x} else {x/=1024}(" humanişlevi.

1-10 aralığında sayılar için ondalık basamak görüntülemek, okuyucunun alıştırması olarak bırakılır.


Bu hem linux hem de mac üzerinde çalıştığım kutu çözümünden bir tanesi. Çok teşekkürler!
Brian Graham

9

Eğer sahip sort -hdeğilseniz, şunları yapabilirsiniz:

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

Bu du listesini alır, soneki ayırır ve onu kullanarak sıralar. <1K için son ek olmadığından, ilk sed bir B ekler (bayt için). İkinci sed, rakam ve son ek arasına bir sınırlayıcı ekler. Üçüncü sed, G'yi Z'ye dönüştürür, böylece M'den daha büyük olur; terabayt dosyalarınız varsa, G'yi Y'ye ve T'yi Z'ye dönüştürmeniz gerekir. Son olarak, iki sütuna göre sıralarız, sonra G sonekini değiştiririz.


Müthiş çaba, ama bu benim için çalışmaya yakın olmuyor.
jvriesem

6

OS X'te, gerekli coreutils'i Homebrew aracılığıyla yükleyebilirsiniz :

brew install coreutils

Bununla gsort, -hkomut satırı parametresini içeren, sahip olacaksınız .


4

Bu küçük Perl senaryosu hile yapar. Olarak kaydet duh(veya ne istersen) ve araduh /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

Mac OS X'in -hseçeneği olmadığından sort, denedim ve öğrendim sedve awkilk denemede:

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

bu uzun bir çizgi. Genişletilmiş, bu:

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; 

}'

Mac OS X Mavericks, Yosemite, Ubuntu 2014-04'te awkvarsayılan awk( nawkher ikisi de awkve her ikisi için de nawkişaret ettiği gibi /usr/bin/mawk) veya gawk ile denedim ve hepsi işe yaradı.

İşte Mac'te çıktının bir örneği:

     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

bunun yerine, du -sk *@ Stefan'ın cevabını büyük toplamın da görüntülendiği yerde gördüm ve kullanarak herhangi bir dosya sistemi bağlama noktasını geçmedendu -skcx *


1

İşte Ubuntu 10.04, CentOS 5.5, FreeBSD ve Mac OS X'te kullanıyorum.

Bu fikri www.geekology.co.za/ ve earthinfo.org adresinden aldım ve O'Reilly tarafından "Linux Server Hacks" den gelen meşhur ördekleri de ödünç aldım . Hala ihtiyaçlarıma adapte ediyorum. Bu hala devam eden bir çalışma (Olduğu gibi, bu sabah trende bunun üzerinde çalışıyordum.):

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

İşte çıktı:

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

Sanırım demek istedin du -cks -x *? (yıldız işareti ile)
nopole

Yıldız işareti bu kullanımda gereksizdir. Bir şans ver.
Stefan Lasiewski

adlı bir dosya içine kodunun ilk setini koyarak demek ducksve sonra chmod a+x ducksve sonra kullanmak ./ducksçalıştırmak için? Sonra sadece toplam disk kullanımını hem Mac OS X'te hem de Ubuntu 2014-10'da görüyorum. Ben de ducks() { ...}tanımı koymayı denedim .bashrcve sonra ducksonu çalıştırmak için kullandım ve aynı şeyi Mac OS X'te de
gördüm

1

Bu senaryo ile delirmek -

$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 yokluğunda sort -hbu, çoğu UNIX ortamında çalışmalıdır:

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

Bu, dosya adlarını boşluk veya kesme işaretleriyle işler ve desteklemeyen xargs -dveya sort -haşağıdakileri desteklemeyen sistemler üzerinde çalışır :

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

hangi sonuçlanır:

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

0

Bu çıktıyı azalan boyut düzenine göre sıralar:

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

Bu çıktıyı artan boyut sırasına göre sıralar:

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

Not: Bu, herhangi bir sütuna göre sıralamak için kullanılabilir, ancak bu sütun değerlerinin aynı formatta olması gerekir.


1
No. sort -k1rneşittir sort -rnve her satırdaki ondalık basamağın ilk sırasına göre sayısal olarak sıralanır. Bu noktayı yüzen anlamıyor ve anlamıyor k, M, G... eklerini. 10.1k 1.23G'den daha büyük olarak kabul edilir
Stéphane Chazelas

0

Solaris'te test edildi!

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

Bu, tüm dizin boyutlarını tekrar tekrar çıkartacaktır, en alttaki Gigabytes'teki en büyük dizin ve Kilobaytlardaki en küçük dizin olacaktır.



0

Komut:

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

Açıklama:

  • Geçerli klasördeki tüm dosya / klasörlerin boyutunu insan tarafından okunabilir biçimde sıralamak

du -ah .

  • İlk sütunda yer alan insan tarafından okunabilir boyutu sırala ve en büyüğü 50

sort -k1 -h | tail -n 50


-1

MB cinsinden boyuta göre sıralamak için

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

Kullanıcı du -h(insan tarafından okunabilir çıktı) çıktısını sayısal olarak sıralamak istiyor . Buna bir cevap vermiyorsun. UNIX-SE hesabınızı, diğer SE sitelerinde bulunan diğer hesaplarla da bağlamak isteyebilirsiniz.
Tonin

-2

Bu betik daha kolay:

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

-2

OSX için

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

-ksadece iptal edici değil -hve eğer öyleyse bu OP tarafından talep edilen insan tarafından okunabilir çıktıyı nasıl sağlıyor?
Anthon,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.