Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux du 指令進階:同時達成人類可讀與排序輸出

編輯:Linux 教學

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 參數

解決方案:Perl 處理單位轉換

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

原理說明

  1. du -sk *:以 KB 為固定單位輸出大小與檔名(Tab 分隔),確保數值可直接數值排序。
  2. sort -n:依數值大小遞增排序。
  3. Perl 迴圈依序嘗試 K、M、G:
    - 當數值 < 1024 時,以該單位輸出(保留一位小數)。
    - 否則除以 1024 進入下一級單位。

替代方案(GNU coreutils ≥ 8.16)

若系統 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' 等方式。
Copyright © Windows教程網 All Rights Reserved