並べ替え方法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
GNU coreutils(ほとんどのLinuxディストリビューションで一般的))を使用している場合は、
du -sh -- * | sort -h
-h
オプションはsort
に、入力が人間が読める形式(単位付きの数値、1024ベース)であることを伝えます。1023は1K未満と見なされ、たまたまGNU du -h
は行います)。
この機能 GNU Core Utilities 7.5 in Aug 2009 に追加されました。
注:
古いバージョンのMac OSXを使用している場合は、
brew install coreutils
を使用してcoreutilsをインストールし、gsort
のドロップイン置換としてsort
を使用する必要があります。新しいバージョンのmacOS(Mojaveで検証済み)は
sort -h
をネイティブでサポートしています。
-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
GNU coreutils の最新バージョンがない場合は、_-h
_なしでdu
を呼び出して、ソート可能な出力を取得できます。少し後処理することで、人に優しい出力を生成します。これには、バージョンの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";
_)の先頭にスペースを入れるか、human
関数の先頭にif (x<1000) {return x} else {x/=1024}
を追加します。
1から10の範囲の数値の10進数字の表示は、読者への課題として残されています。
ない場合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サフィックスを置き換えます。
OS Xでは、必要なcoreutilsを Homebrew でインストールできます。
brew install coreutils
これにより、gsort
が作成されます。これには、-h
コマンドラインパラメーターが含まれます。
この小さな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;
Mac OS Xには-h
sort
のオプションなので、最初にsed
とawk
を試して学習しました。
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
です。awk
とnawk
ポイント/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 *
これは私がUbuntu 10.04、CentOS 5.5、FreeBSD、Mac OS Xで使用しているものです。
私は www.geekology.co.za/ と earthinfo.org からアイデアを借用し、悪名高い ducks を "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:~ $
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 }'
このスクリプトに夢中になる-
$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;}'
コマンド:
du -ah . | sort -k1 -h | tail -n 50
説明:
du -ah .
sort -k1 -h | tail -n 50
最大のものは下にあります:
du -sh * | sort -h
これは空白またはアポストロフィを含むファイル名を処理し、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
これは出力をサイズの降順でソートします:
du -sh /var/* | sort -k 1rn
これにより、サイズの昇順で出力がソートされます。
du -sh /var/* | sort -k 1n
PS:これは任意の列で並べ替えるために使用できますが、その列の値は同じ形式である必要があります
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
これにより、すべてのディレクトリサイズが再帰的に出力されます。一番下がギガバイト単位で最大のディレクトリ、一番上がキロバイト単位で最小のディレクトリになります。