du -sh * 能以 K/M/G 單位顯示各檔案/目錄大小(human-readable),但缺點是無法直接配合 sort 排序,因為 sort 會將 8.4G、2.6G、12K 視為字串比較,導致順序錯亂。本文提供一個 Perl 一行腳本,先以 KB 為單位排序,再動態轉換單位,完美解決此問題。
$ du -sh *
8.4G Desktop
2.6G Documents
12K keys
12M Pictures
536K scripts
# 若直接 | sort -h(GNU sort 支援)可行,但舊系統無 -h 參數
du -sk * | sort -n |
perl -ne '
($s,$f)=split(m{\t}); # 分離大小(KB)與檔名
for (qw(K M G)) { # 依 K→M→G 遞減單位
if ($s < 1024) {
printf("%.1f%s\t%s", $s, $_, $f);
last;
}
$s /= 1024; # 除以 1024 進入下一單位
}
'
12.0K keys
536.0K scripts
12.0M Pictures
2.6G Documents
8.4G Desktop
du -sk *:以 KB 為固定單位輸出大小與檔名(Tab 分隔),確保數值可直接數值排序。sort -n:依數值大小遞增排序。若系統 sort 支援 -h(human-numeric-sort),可簡化為:
du -sh * | sort -h
但為了最大相容性(嵌入式裝置、舊版 Unix),Perl 方案更通用。
將以下函數加入 ~/.bashrc,即可隨時使用 dus 指令:
dus() {
du -sk "${@:-*}" | sort -n |
perl -ne '
($s,$f)=split(m{\t});
for (qw(K M G)) {
if ($s < 1024) {
printf("%.1f%s\t%s", $s, $_, $f);
last;
}
$s /= 1024;
}
'
}
用法:dus(目前目錄)、dus /var/log(指定目錄)、dus *(通配)。
小提醒:du -sk統計的是磁碟佔用空間(含區塊對齊),非檔案實際位元組總和;若需精確位元組數,請改用find -printf '%s\n'等方式。