磁碟空間不足時,df(檔案系統級)與 du(目錄/檔案級)是黃金搭檔。本文系統整理兩者參數、差異、組合使用技巧,並補充 ls -h、統計檔案數等實用技巧。
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/vda1 20G 2.6G 17G 14% /
# tmpfs 972M 0 972M 0% /dev/shm
-h / -H:人類可讀單位(K/M/G,1024/1000 進制)。-T:顯示檔案系統類型(ext4、xfs、nfs...)。-i:顯示 inode 使用率(大量小檔案場景關鍵)。--output=source,size,used,avail,pcent,target:自訂欄位,適合腳本解析。
# 顯示 /home/wwwroot 下一級目錄大小(人類可讀)
du -h --max-depth=1 /home/wwwroot
# 10M /home/wwwroot/domains.com
# 20M /home/wwwroot/domains2.com
# 40M /home/wwwroot
-h:人類可讀單位。-s / --summarize:僅顯示總計,不列出子目錄。--max-depth=N:限制遞歸深度(-d N 於 BSD/macOS)。-a / --all:包含檔案(預設僅目錄)。-c / --total:最後顯示總計行。--exclude=PATTERN:排除模式(如 --exclude='*.log')。| 維度 | df | du |
|---|---|---|
| 統計對象 | 檔案系統塊 | 檔案/目錄大小總和 |
| 已刪除開啟檔案 | **計入已用**(塊未釋放) | **不計入**(目錄項已移除) |
| 掛載點遮蔽 | 顯示掛載後可見空間 | 遞歸掃描,受掛載點影響 |
| 稀疏檔案 | 計實際分配塊 | 計視邏輯大小(可用 --apparent-size) |
場景:rm /var/log/big.log 但進程仍寫入 → df 仍顯示滿,du 顯示釋放。需 lsof | grep deleted 找到進程重啟或 > /proc/pid/fd/n 釋放。
# 1. 找出根分區佔用前 10 大目錄
du -h --max-depth=1 / | sort -hr | head -10
# 2. 統計當前目錄下每個一級項目大小(MB),按數值排序
du -m --max-depth=1 | sort -nr
# 3. 查看某用戶家目錄大小
du -sh /home/username
# 4. 統計目錄下檔案總數(含子目錄)
find /path -type f | wc -l
# 或
du /path | wc -l # 近似值,含目錄行
# 5. ls 以 K/M/G 顯示檔案大小
ls -lh
# -rw-r--r-- 1 root root 30M May 24 10:07 cuss.war
df -i
# 找出 inode 佔用最多的目錄
find / -xdev -printf '%h\n' | sort | uniq -c | sort -nr | head -10
熟練掌握 df/du/ls 三劍客,磁碟空間排查不再盲目。