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

3
これは以前に見たことがあることを知っていた。そこで投票された最高の回答はあまり良くありませんが、 他の ものは より良いです。
ジル

受け入れられた答えsort -hは、2017年8月のUbuntu 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は1G未満と見なされ、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利用可能であるべきです。
ケノーブ

ああ--rのリマインダーをありがとう。つまりtail、豚を見るのにコマンドは必要ありません。
SDsolar

47

-kフラグを使用して、人間が読める形式を使用する代わりに1Kブロックをカウントしてみてください。次に、共通のユニットがあり、数値の並べ替えを簡単に行うことができます。

du -ck | sort -n

明示的に人間のユニットを必要とするわけではありませんが、必要な場合は、それを行う方法がたくさんあります。多くの場合、上記の1Kブロック技術を使用してから、duを2回呼び出します。

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
素敵な私は必要な結果を得るために何かをインストールする必要がない
タラナキ

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の範囲の数値に10進数を表示することは、読者への課題として残されています。


これは、LinuxとMacの両方で動作することがわかった、すぐに使用できるソリューションです。どうもありがとう!
ブライアングラハム

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(バイト)を追加します。2番目のsedは、数字とサフィックスの間に区切り文字を追加します。3番目のsedはGをZに変換するため、Mより大きくなります。テラバイトファイルがある場合は、GをYに、TをZに変換する必要があります。最後に、2つの列で並べ替えてから、Gサフィックスを置き換えます。


素晴らしい努力ですが、これは私のために働くことに近づいていません。
jvriesem

6

OS Xでは、Homebrewを使用して必要なcoreutilsをインストールできます。

brew install coreutils

これによりgsort-hコマンドラインパラメータを含むができます。


4

この小さなPerlスクリプトがトリックを行います。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

Mac 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; 

}'

Mac OS X Mavericks、Yosemite、Ubuntu 2014-04をawkデフォルトawk(これはnawkで、両方awknawk指すため/usr/bin/mawk)またはgawkで試してみましたが、すべて機能していました。

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からアイデアを借りました。また、O'Reillyの「Linux Server Hacks」から悪名高いアヒルを借りました。私はまだ自分のニーズに合わせて調整しています。これはまだ進行中の作業です(今朝、電車でこれに取り組んでいました)。

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

この使用法では、アスタリスクは冗長です。試してみる。
ステファン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

PS:これは任意の列でソートするために使用できますが、その列の値は同じ形式である必要があります


1
No. sort -k1rnsort -rn、各行の10進数の最初のシーケンスに基づいて数値的に並べ替えられます。これは、浮動小数点を理解していない、それは理解していないkMG...サフィックスを。10.1kは1.23Gよりも大きいと考えられる
ステファン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サイトにある他のアカウントとリンクすることもできます。
トニン

-2

このスクリプトはさらに簡単です。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.