Linux使用du命令查看文件和目錄的磁盤占用
引言
在 Linux 系統(tǒng)管理中,磁盤空間的精確管理是確保系統(tǒng)穩(wěn)定運行的關(guān)鍵環(huán)節(jié)。當(dāng)我們遇到磁盤空間不足、系統(tǒng)響應(yīng)緩慢或存儲資源緊張等問題時,準(zhǔn)確找出占用磁盤空間最多的文件和目錄就顯得尤為重要。du 命令(英文全稱:disk usage)正是解決這一難題的強(qiáng)大工具。它能夠遞歸地計算文件和目錄所占用的磁盤空間,幫助我們快速定位“磁盤殺手”,為系統(tǒng)優(yōu)化和存儲規(guī)劃提供堅實的數(shù)據(jù)支持。掌握 du 命令的精髓,不僅能提升我們的工作效率,更能讓我們在復(fù)雜的存儲環(huán)境中游刃有余。
一、du命令簡介
du 命令(英文全稱:disk usage)是 Linux 系統(tǒng)中一個用于估算文件和目錄磁盤使用的命令行工具。它能夠遞歸地遍歷文件系統(tǒng),計算每個文件和目錄所占用的磁盤空間,并以易于理解的方式展示出來。無論是排查大文件、優(yōu)化存儲空間,還是進(jìn)行容量規(guī)劃,du 命令都是系統(tǒng)管理員和普通用戶不可或缺的利器。
1.1 為什么使用du?
- 精準(zhǔn)定位:準(zhǔn)確找出占用磁盤空間最多的文件和目錄。
- 故障排查:快速識別導(dǎo)致磁盤空間不足的原因。
- 性能優(yōu)化:通過分析文件大小優(yōu)化系統(tǒng)性能。
- 容量規(guī)劃:為未來的存儲需求提供數(shù)據(jù)依據(jù)。
- 自動化監(jiān)控:在腳本中用于磁盤使用情況的監(jiān)控和告警。
1.2du命令的運行原理
du 命令通過讀取文件系統(tǒng)的元數(shù)據(jù)來計算磁盤使用情況。它會遞歸地遍歷指定目錄下的所有子目錄和文件,累加每個文件的大小,并最終給出總計。du 命令可以處理硬鏈接(hard links),在計算時會考慮硬鏈接的情況,避免重復(fù)計算。
1.3 基本用法示例
$ du 4 ./subdir1 8 ./subdir2 12 .
這個簡單的命令會顯示當(dāng)前目錄下所有子目錄和文件的磁盤占用情況(以 1K 塊為單位)。輸出格式為:占用空間(單位:1K 塊) + 文件或目錄路徑。
二、du命令的基礎(chǔ)用法
2.1 顯示當(dāng)前目錄的磁盤占用
最基礎(chǔ)的用法是直接運行 du 命令,顯示當(dāng)前目錄及其子目錄的磁盤占用情況。
$ du 4 ./subdir1 8 ./subdir2 12 .
2.2 顯示指定目錄的磁盤占用
可以指定特定目錄來查看其磁盤占用情況。
$ du /home/user 4 /home/user/subdir1 8 /home/user/subdir2 12 /home/user
2.3 顯示指定目錄下所有文件和目錄的占用
使用 -a 選項可以顯示指定目錄下所有文件和目錄的占用情況,而不是只顯示目錄本身的大小。
$ du -a /home/user 4 /home/user/subdir1/file1.txt 8 /home/user/subdir2/file2.txt 4 /home/user/subdir1 8 /home/user/subdir2 12 /home/user
2.4 以人類可讀格式顯示
使用 -h 選項可以將以 1K 塊為單位的數(shù)字轉(zhuǎn)換為更易讀的格式(K, M, G, T)。
$ du -h /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user
三、du命令的高級選項詳解
3.1-s選項:只顯示總計
-s 選項用于只顯示指定目錄的總計磁盤占用,而不顯示其子目錄的詳細(xì)信息。
$ du -s /home/user 12K /home/user
3.2-c選項:顯示總計
-c 選項可以在輸出末尾顯示所有文件和目錄的總計。
$ du -c /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user total 12K
3.3-h選項:人類可讀格式
-h 選項將輸出以人類可讀的格式顯示,自動選擇合適的單位(K, M, G, T)。
$ du -h /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user
3.4-k選項:以 1K 塊為單位顯示
-k 選項強(qiáng)制以 1K 塊為單位顯示磁盤空間,這是 du 命令的默認(rèn)行為。
$ du -k /home/user 4 /home/user/subdir1/file1.txt 8 /home/user/subdir2/file2.txt 4 /home/user/subdir1 8 /home/user/subdir2 12 /home/user
3.5-m選項:以 1M 塊為單位顯示
-m 選項以 1M 塊為單位顯示磁盤空間。
$ du -m /home/user 0 /home/user/subdir1/file1.txt 0 /home/user/subdir2/file2.txt 0 /home/user/subdir1 0 /home/user/subdir2 0 /home/user
3.6-g選項:以 1G 塊為單位顯示
-g 選項以 1G 塊為單位顯示磁盤空間。
$ du -g /home/user 0 /home/user/subdir1/file1.txt 0 /home/user/subdir2/file2.txt 0 /home/user/subdir1 0 /home/user/subdir2 0 /home/user
3.7-S選項:不包括子目錄
-S 選項用于不包括子目錄的大小,只顯示目錄本身的大小。
$ du -S /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 12K /home/user
3.8-x選項:不跨越文件系統(tǒng)邊界
-x 選項用于不跨越文件系統(tǒng)邊界進(jìn)行計算,只計算當(dāng)前文件系統(tǒng)內(nèi)的占用。
$ du -x /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user
3.9-D選項:顯示符號鏈接的大小
-D 選項用于顯示符號鏈接本身的大小,而不是它指向的目標(biāo)文件的大小。
$ du -D /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user
3.10-L選項:跟隨符號鏈接
-L 選項用于跟隨符號鏈接,計算符號鏈接指向的文件的實際大小。
$ du -L /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 4.0K /home/user/subdir1 8.0K /home/user/subdir2 12K /home/user
四、du命令在腳本中的應(yīng)用
4.1 磁盤空間監(jiān)控腳本
編寫一個簡單的腳本來監(jiān)控特定目錄的磁盤使用情況。
#!/bin/bash
# 磁盤空間監(jiān)控腳本
TARGET_DIR="/home/user"
THRESHOLD=100 # 設(shè)置閾值為 100MB
# 獲取磁盤使用情況
USAGE=$(du -sm "$TARGET_DIR" 2>/dev/null | cut -f1)
# 檢查是否超過閾值
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Warning: $TARGET_DIR is using ${USAGE}MB, exceeding threshold of ${THRESHOLD}MB"
else
echo "OK: $TARGET_DIR is using ${USAGE}MB"
fi
4.2 查找最大文件腳本
編寫一個腳本來查找目錄中最大的文件。
#!/bin/bash # 查找最大文件的腳本 TARGET_DIR="/home/user" MAX_FILES=5 # 顯示前 5 個最大的文件 echo "Top $MAX_FILES largest files in $TARGET_DIR:" du -ah "$TARGET_DIR" 2>/dev/null | sort -rh | head -"$MAX_FILES"
4.3 定期清理腳本
結(jié)合 du 命令和 find 命令,編寫一個自動清理腳本。
#!/bin/bash # 清理 /tmp 目錄中超過 7 天的文件 # 先檢查 /tmp 目錄的磁盤使用情況 echo "Before cleanup:" du -sh /tmp 2>/dev/null # 清理舊文件 find /tmp -type f -mtime +7 -delete 2>/dev/null # 檢查清理后的磁盤使用情況 echo "After cleanup:" du -sh /tmp 2>/dev/null
4.4 磁盤空間報告生成
生成詳細(xì)的磁盤空間報告。
#!/bin/bash
# 生成磁盤空間報告
REPORT_FILE="/tmp/disk_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "Disk Space Report - $(date)"
echo "================================="
echo ""
echo "1. Top 10 Largest Directories:"
echo "-------------------------------"
du -h / 2>/dev/null | sort -rh | head -10
echo ""
echo "2. Top 10 Largest Files:"
echo "------------------------"
find / -type f -exec du -h {} \; 2>/dev/null | sort -rh | head -10
echo ""
echo "3. Current Directory Usage:"
echo "---------------------------"
du -h . 2>/dev/null | sort -rh | head -10
} > "$REPORT_FILE"
echo "Report generated: $REPORT_FILE"
五、du命令與其他命令的結(jié)合使用
5.1 與grep結(jié)合篩選特定信息
使用 grep 過濾 du 命令的輸出,獲取特定信息。
# 查找大于 100MB 的文件或目錄 $ du -h /home/user | grep -E '[0-9]+G|[0-9]+M' 1.2G /home/user/large_dir 512M /home/user/big_file.zip # 查找特定類型的文件 $ du -h /home/user | grep "\.log$" 1.2K /home/user/app.log 2.4K /home/user/error.log
5.2 與awk結(jié)合處理數(shù)據(jù)
使用 awk 對 du 命令的輸出進(jìn)行復(fù)雜的數(shù)據(jù)處理。
# 計算所有文件的總大小
$ du -sb /home/user/* 2>/dev/null | awk '{sum += $1} END {print "Total size: " sum " bytes"}'
# 找出使用空間最大的目錄
$ du -s /home/user/* 2>/dev/null | sort -nr | head -1
10485760 /home/user/large_dir
5.3 與sort結(jié)合排序
使用 sort 對 du 命令的輸出進(jìn)行排序。
# 按照大小降序排列 $ du -h /home/user | sort -rh # 按照大小升序排列 $ du -h /home/user | sort -hr
5.4 與wc結(jié)合統(tǒng)計行數(shù)
使用 wc 統(tǒng)計 du 命令輸出的行數(shù)。
# 統(tǒng)計目錄下文件和目錄的數(shù)量 $ du -a /home/user | wc -l 15 # 統(tǒng)計非空行的數(shù)量 $ du -a /home/user | grep -v "^0" | wc -l 10
5.5 與head和tail結(jié)合截取數(shù)據(jù)
使用 head 和 tail 來截取 du 命令的部分輸出。
# 顯示前 5 個最大的文件或目錄 $ du -h /home/user | sort -rh | head -5 # 顯示最后 5 個文件或目錄 $ du -h /home/user | sort -rh | tail -5
5.6 與sed結(jié)合格式化輸出
使用 sed 對 du 命令的輸出進(jìn)行格式化。
# 將文件大小前綴替換為星號 $ du -h /home/user | sed 's/\([0-9]*\)[KMGT]/\*\1\*/'
六、du命令的實用技巧與最佳實踐
6.1 快速查看大文件或目錄
結(jié)合 du 命令和 sort 命令,快速定位占用空間大的文件或目錄。
# 查看根目錄下最大的目錄 $ du -h / | sort -rh | head -10 # 查看當(dāng)前目錄下最大的文件 $ du -ah | sort -rh | head -10
6.2 創(chuàng)建別名簡化操作
在 .bashrc 文件中添加別名,提高使用效率。
# 添加到 ~/.bashrc alias duh='du -h' alias duf='du -sh' alias dufull='du -h --max-depth=1' # 重新加載配置 $ source ~/.bashrc # 使用別名 $ duh /home/user $ duf /home/user $ dufull /
6.3 監(jiān)控腳本模板
創(chuàng)建一個通用的磁盤監(jiān)控腳本模板。
#!/bin/bash
# 通用磁盤監(jiān)控腳本
check_directory_usage() {
local target_dir=${1:-"/"}
local threshold=${2:-100} # 默認(rèn)閾值為 100MB
local log_file=${3:-"/var/log/disk_monitor.log"}
echo "$(date): Checking usage of $target_dir..." >> "$log_file"
# 獲取目錄大小
size=$(du -sm "$target_dir" 2>/dev/null | cut -f1)
if [ "$size" -gt "$threshold" ]; then
echo "$(date): WARNING: $target_dir is using ${size}MB, exceeding threshold of ${threshold}MB" >> "$log_file"
else
echo "$(date): OK: $target_dir is using ${size}MB" >> "$log_file"
fi
}
# 調(diào)用函數(shù)
check_directory_usage "/"
6.4 處理硬鏈接和符號鏈接
du 命令在處理硬鏈接時會特別注意,避免重復(fù)計算。
# 創(chuàng)建硬鏈接測試 $ touch file1.txt $ ln file1.txt file2.txt # 查看硬鏈接的大小 $ du -h file1.txt file2.txt 4.0K file1.txt 4.0K file2.txt # 使用 -S 選項,不包括子目錄 $ du -S -h /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 12K /home/user
七、du命令的性能考量與注意事項
7.1 性能影響
du 命令的性能取決于所遍歷的目錄層級和文件數(shù)量。對于大型目錄樹,du 命令可能會花費較長時間??梢酝ㄟ^使用 -max-depth 選項來限制遞歸深度,從而提高性能。
7.2 內(nèi)存使用
du 命令的內(nèi)存占用相對較小,但在處理大量文件時,可能會暫時占用較多內(nèi)存。
7.3 磁盤 I/O
du 命令需要讀取文件系統(tǒng)元數(shù)據(jù),對磁盤 I/O 有一定影響,尤其是在處理大量小文件時。
7.4 權(quán)限要求
在某些情況下,du 命令可能需要 root 權(quán)限才能讀取某些受保護(hù)的文件或目錄。
# 普通用戶可能無法訪問某些目錄 $ du -h /root du: cannot access '/root': Permission denied # root 用戶可以訪問 $ sudo du -h /root 4.0K /root/.bashrc 8.0K /root/.profile 12K /root
八、du命令的跨平臺兼容性
8.1 不同 Unix/Linux 發(fā)行版
du 命令在大多數(shù) Unix 和 Linux 系統(tǒng)中都可用,包括 Ubuntu、CentOS、Fedora、Debian、Arch Linux 等。不同發(fā)行版的默認(rèn)行為基本一致,但某些選項可能略有差異。
8.2 與 macOS 的兼容性
在 macOS 系統(tǒng)中,du 命令也存在,但部分選項可能與 Linux 系統(tǒng)略有不同。
# macOS 中的 du 命令 $ du -h /Applications 1.2G /Applications
8.3 在容器環(huán)境中的表現(xiàn)
在 Docker 等容器環(huán)境中,du 命令同樣正常工作,其行為與宿主機(jī)一致。
$ docker run -it ubuntu bash root@container:/# du -h / 4.0K /bin 8.0K /boot ...
九、du命令的常見問題與解決方案
9.1 磁盤空間顯示異常
問題描述
du 命令顯示的磁盤空間與 df 命令顯示的不一致。
解決方案
# 檢查是否有進(jìn)程正在使用已刪除的文件 $ lsof +L1 # 檢查文件系統(tǒng)狀態(tài) $ df -h # 使用 -S 選項避免子目錄計算 $ du -S -h /home/user
9.2 命令執(zhí)行緩慢
問題描述
在大型目錄中使用 du 命令時執(zhí)行速度慢。
解決方案
# 使用 -max-depth 選項限制遞歸深度
$ du -h --max-depth=2 /home/user
# 只計算特定類型文件
$ find /home/user -type f -name "*.log" -exec du -h {} \;
9.3 權(quán)限問題導(dǎo)致信息缺失
問題描述
普通用戶無法查看某些目錄的詳細(xì)信息。
解決方案
# 使用 sudo 獲取完整信息 $ sudo du -h /root # 或者檢查目錄權(quán)限 $ ls -ld /root drwx------ 2 root root 4096 Jan 1 00:00 /root
9.4 硬鏈接重復(fù)計算問題
問題描述
在某些情況下,硬鏈接可能導(dǎo)致重復(fù)計算。
解決方案
# 使用 -S 選項避免子目錄計算 $ du -S -h /home/user # 使用 -L 選項跟隨符號鏈接 $ du -L -h /home/user
十、du命令的未來發(fā)展方向
10.1 更智能的磁盤分析
未來的 du 命令可能會集成更智能的分析功能,例如自動識別潛在的存儲問題、預(yù)測存儲需求等。
10.2 與云存儲集成
隨著云計算的發(fā)展,du 命令可能會更好地支持云存儲服務(wù)的磁盤空間監(jiān)控。
10.3 更豐富的可視化支持
du 命令可能會提供更多的可視化選項,如圖形化界面或圖表展示。
10.4 更完善的 API 支持
為了更好地與其他監(jiān)控和管理系統(tǒng)集成,du 命令可能會提供更完善的 API 支持。
十一、總結(jié)
du 命令作為 Linux 系統(tǒng)中一個強(qiáng)大而靈活的工具,其在磁盤空間管理中的作用不容小覷。從基礎(chǔ)的目錄大小查看到復(fù)雜的腳本集成,du 命令都能提供可靠的支持。通過本文的詳細(xì)介紹,我們不僅掌握了 du 命令的基礎(chǔ)用法和各種選項,還深入了解了它在腳本中的應(yīng)用、與其他命令的結(jié)合使用、性能考量以及常見問題的解決方法。
du 命令的簡潔性和高效性使其成為 Linux 用戶和系統(tǒng)管理員的首選工具之一。無論是日常的磁盤監(jiān)控、故障排查,還是復(fù)雜的存儲管理任務(wù),du 命令都能以最小的開銷提供最大的便利。它的跨平臺兼容性也保證了在不同環(huán)境下的穩(wěn)定使用。
在日常的 Linux 使用和系統(tǒng)管理工作中,du 命令無處不在。它不僅是初學(xué)者入門 Linux 的第一課,也是資深用戶進(jìn)行復(fù)雜任務(wù)時的得力助手。從簡單的文件大小查看到復(fù)雜的容量規(guī)劃,du 都能以其簡潔優(yōu)雅的方式滿足需求。
記住,掌握 du 命令不僅僅是學(xué)會如何查看文件和目錄的磁盤占用,更是理解和構(gòu)建 Linux 系統(tǒng)存儲管理生態(tài)的重要一步。在不斷探索和實踐中,你會發(fā)現(xiàn) du 命令在各種場景下的無限可能性。它就像一個磁盤空間的偵探,幫助我們在 Linux 世界的旅程中精準(zhǔn)定位每一個“磁盤殺手”。
以上就是Linux使用du命令查看文件和目錄的磁盤占用的詳細(xì)內(nèi)容,更多關(guān)于Linux du查看文件和目錄磁盤占用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux創(chuàng)建Shell腳本.sh文件的三種方法
本文詳細(xì)介紹了在Linux系統(tǒng)中創(chuàng)建Shell腳本文件的幾種方法,包括使用vim、nano編輯器和快速創(chuàng)建空文件,同時,強(qiáng)調(diào)了賦予腳本執(zhí)行權(quán)限和建議將腳本放在/usr/local/bin/目錄下的重要性,需要的朋友可以參考下2026-02-02
linux下獲取當(dāng)前時間的相關(guān)函數(shù)
這篇文章主要介紹了linux下獲取當(dāng)前時間的相關(guān)函數(shù),具有很好的參考價值,希望對大家有所幫助,2023-09-09
Apache?Linkis?中間件架構(gòu)及快速安裝步驟
作為計算中間件,Linkis 提供了強(qiáng)大的連通、復(fù)用、編排、擴(kuò)展和治理管控能力,通過計算中間件將應(yīng)用層和引擎層解耦,簡化了復(fù)雜的網(wǎng)絡(luò)調(diào)用關(guān)系,本文給大家介紹Apache?Linkis?中間件架構(gòu)的相關(guān)知識,感興趣的朋友一起看看吧2022-03-03
Linux下安裝grafana并且添加influxdb監(jiān)控的方法
這篇文章主要介紹了Linux下安裝grafana并且添加influxdb監(jiān)控的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12

