Linux使用du命令查看文件和目錄的磁盤占用
引言
在 Linux 系統(tǒng)管理中,磁盤空間的精確管理是確保系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵環(huán)節(jié)。當(dāng)我們遇到磁盤空間不足、系統(tǒng)響應(yīng)緩慢或存儲(chǔ)資源緊張等問題時(shí),準(zhǔn)確找出占用磁盤空間最多的文件和目錄就顯得尤為重要。du 命令(英文全稱:disk usage)正是解決這一難題的強(qiáng)大工具。它能夠遞歸地計(jì)算文件和目錄所占用的磁盤空間,幫助我們快速定位“磁盤殺手”,為系統(tǒng)優(yōu)化和存儲(chǔ)規(guī)劃提供堅(jiān)實(shí)的數(shù)據(jù)支持。掌握 du 命令的精髓,不僅能提升我們的工作效率,更能讓我們?cè)趶?fù)雜的存儲(chǔ)環(huán)境中游刃有余。
一、du命令簡介
du 命令(英文全稱:disk usage)是 Linux 系統(tǒng)中一個(gè)用于估算文件和目錄磁盤使用的命令行工具。它能夠遞歸地遍歷文件系統(tǒng),計(jì)算每個(gè)文件和目錄所占用的磁盤空間,并以易于理解的方式展示出來。無論是排查大文件、優(yōu)化存儲(chǔ)空間,還是進(jìn)行容量規(guī)劃,du 命令都是系統(tǒng)管理員和普通用戶不可或缺的利器。
1.1 為什么使用du?
- 精準(zhǔn)定位:準(zhǔn)確找出占用磁盤空間最多的文件和目錄。
- 故障排查:快速識(shí)別導(dǎo)致磁盤空間不足的原因。
- 性能優(yōu)化:通過分析文件大小優(yōu)化系統(tǒng)性能。
- 容量規(guī)劃:為未來的存儲(chǔ)需求提供數(shù)據(jù)依據(jù)。
- 自動(dòng)化監(jiān)控:在腳本中用于磁盤使用情況的監(jiān)控和告警。
1.2du命令的運(yùn)行原理
du 命令通過讀取文件系統(tǒng)的元數(shù)據(jù)來計(jì)算磁盤使用情況。它會(huì)遞歸地遍歷指定目錄下的所有子目錄和文件,累加每個(gè)文件的大小,并最終給出總計(jì)。du 命令可以處理硬鏈接(hard links),在計(jì)算時(shí)會(huì)考慮硬鏈接的情況,避免重復(fù)計(jì)算。
1.3 基本用法示例
$ du 4 ./subdir1 8 ./subdir2 12 .
這個(gè)簡單的命令會(huì)顯示當(dāng)前目錄下所有子目錄和文件的磁盤占用情況(以 1K 塊為單位)。輸出格式為:占用空間(單位:1K 塊) + 文件或目錄路徑。
二、du命令的基礎(chǔ)用法
2.1 顯示當(dāng)前目錄的磁盤占用
最基礎(chǔ)的用法是直接運(yùn)行 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 選項(xiàng)可以顯示指定目錄下所有文件和目錄的占用情況,而不是只顯示目錄本身的大小。
$ 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 選項(xiàng)可以將以 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命令的高級(jí)選項(xiàng)詳解
3.1-s選項(xiàng):只顯示總計(jì)
-s 選項(xiàng)用于只顯示指定目錄的總計(jì)磁盤占用,而不顯示其子目錄的詳細(xì)信息。
$ du -s /home/user 12K /home/user
3.2-c選項(xiàng):顯示總計(jì)
-c 選項(xiàng)可以在輸出末尾顯示所有文件和目錄的總計(jì)。
$ 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選項(xiàng):人類可讀格式
-h 選項(xiàng)將輸出以人類可讀的格式顯示,自動(dòng)選擇合適的單位(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選項(xiàng):以 1K 塊為單位顯示
-k 選項(xiàng)強(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選項(xiàng):以 1M 塊為單位顯示
-m 選項(xiàng)以 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選項(xiàng):以 1G 塊為單位顯示
-g 選項(xiàng)以 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選項(xiàng):不包括子目錄
-S 選項(xiàng)用于不包括子目錄的大小,只顯示目錄本身的大小。
$ du -S /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 12K /home/user
3.8-x選項(xiàng):不跨越文件系統(tǒng)邊界
-x 選項(xiàng)用于不跨越文件系統(tǒng)邊界進(jìn)行計(jì)算,只計(jì)算當(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選項(xiàng):顯示符號(hào)鏈接的大小
-D 選項(xiàng)用于顯示符號(hào)鏈接本身的大小,而不是它指向的目標(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選項(xiàng):跟隨符號(hào)鏈接
-L 選項(xiàng)用于跟隨符號(hào)鏈接,計(jì)算符號(hào)鏈接指向的文件的實(shí)際大小。
$ 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)控腳本
編寫一個(gè)簡單的腳本來監(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 查找最大文件腳本
編寫一個(gè)腳本來查找目錄中最大的文件。
#!/bin/bash # 查找最大文件的腳本 TARGET_DIR="/home/user" MAX_FILES=5 # 顯示前 5 個(gè)最大的文件 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 命令,編寫一個(gè)自動(dòng)清理腳本。
#!/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 磁盤空間報(bào)告生成
生成詳細(xì)的磁盤空間報(bào)告。
#!/bin/bash
# 生成磁盤空間報(bào)告
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ì) du 命令的輸出進(jìn)行復(fù)雜的數(shù)據(jù)處理。
# 計(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ì) du 命令的輸出進(jìn)行排序。
# 按照大小降序排列 $ du -h /home/user | sort -rh # 按照大小升序排列 $ du -h /home/user | sort -hr
5.4 與wc結(jié)合統(tǒng)計(jì)行數(shù)
使用 wc 統(tǒng)計(jì) du 命令輸出的行數(shù)。
# 統(tǒng)計(jì)目錄下文件和目錄的數(shù)量 $ du -a /home/user | wc -l 15 # 統(tǒng)計(jì)非空行的數(shù)量 $ du -a /home/user | grep -v "^0" | wc -l 10
5.5 與head和tail結(jié)合截取數(shù)據(jù)
使用 head 和 tail 來截取 du 命令的部分輸出。
# 顯示前 5 個(gè)最大的文件或目錄 $ du -h /home/user | sort -rh | head -5 # 顯示最后 5 個(gè)文件或目錄 $ du -h /home/user | sort -rh | tail -5
5.6 與sed結(jié)合格式化輸出
使用 sed 對(duì) du 命令的輸出進(jìn)行格式化。
# 將文件大小前綴替換為星號(hào) $ du -h /home/user | sed 's/\([0-9]*\)[KMGT]/\*\1\*/'
六、du命令的實(shí)用技巧與最佳實(shí)踐
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)建一個(gè)通用的磁盤監(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 處理硬鏈接和符號(hào)鏈接
du 命令在處理硬鏈接時(shí)會(huì)特別注意,避免重復(fù)計(jì)算。
# 創(chuàng)建硬鏈接測(cè)試 $ touch file1.txt $ ln file1.txt file2.txt # 查看硬鏈接的大小 $ du -h file1.txt file2.txt 4.0K file1.txt 4.0K file2.txt # 使用 -S 選項(xiàng),不包括子目錄 $ du -S -h /home/user 4.0K /home/user/subdir1/file1.txt 8.0K /home/user/subdir2/file2.txt 12K /home/user
七、du命令的性能考量與注意事項(xiàng)
7.1 性能影響
du 命令的性能取決于所遍歷的目錄層級(jí)和文件數(shù)量。對(duì)于大型目錄樹,du 命令可能會(huì)花費(fèi)較長時(shí)間??梢酝ㄟ^使用 -max-depth 選項(xiàng)來限制遞歸深度,從而提高性能。
7.2 內(nèi)存使用
du 命令的內(nèi)存占用相對(duì)較小,但在處理大量文件時(shí),可能會(huì)暫時(shí)占用較多內(nèi)存。
7.3 磁盤 I/O
du 命令需要讀取文件系統(tǒng)元數(shù)據(jù),對(duì)磁盤 I/O 有一定影響,尤其是在處理大量小文件時(shí)。
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命令的跨平臺(tái)兼容性
8.1 不同 Unix/Linux 發(fā)行版
du 命令在大多數(shù) Unix 和 Linux 系統(tǒng)中都可用,包括 Ubuntu、CentOS、Fedora、Debian、Arch Linux 等。不同發(fā)行版的默認(rèn)行為基本一致,但某些選項(xiàng)可能略有差異。
8.2 與 macOS 的兼容性
在 macOS 系統(tǒng)中,du 命令也存在,但部分選項(xiàng)可能與 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 選項(xiàng)避免子目錄計(jì)算 $ du -S -h /home/user
9.2 命令執(zhí)行緩慢
問題描述
在大型目錄中使用 du 命令時(shí)執(zhí)行速度慢。
解決方案
# 使用 -max-depth 選項(xiàng)限制遞歸深度
$ du -h --max-depth=2 /home/user
# 只計(jì)算特定類型文件
$ 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ù)計(jì)算問題
問題描述
在某些情況下,硬鏈接可能導(dǎo)致重復(fù)計(jì)算。
解決方案
# 使用 -S 選項(xiàng)避免子目錄計(jì)算 $ du -S -h /home/user # 使用 -L 選項(xiàng)跟隨符號(hào)鏈接 $ du -L -h /home/user
十、du命令的未來發(fā)展方向
10.1 更智能的磁盤分析
未來的 du 命令可能會(huì)集成更智能的分析功能,例如自動(dòng)識(shí)別潛在的存儲(chǔ)問題、預(yù)測(cè)存儲(chǔ)需求等。
10.2 與云存儲(chǔ)集成
隨著云計(jì)算的發(fā)展,du 命令可能會(huì)更好地支持云存儲(chǔ)服務(wù)的磁盤空間監(jiān)控。
10.3 更豐富的可視化支持
du 命令可能會(huì)提供更多的可視化選項(xiàng),如圖形化界面或圖表展示。
10.4 更完善的 API 支持
為了更好地與其他監(jiān)控和管理系統(tǒng)集成,du 命令可能會(huì)提供更完善的 API 支持。
十一、總結(jié)
du 命令作為 Linux 系統(tǒng)中一個(gè)強(qiáng)大而靈活的工具,其在磁盤空間管理中的作用不容小覷。從基礎(chǔ)的目錄大小查看到復(fù)雜的腳本集成,du 命令都能提供可靠的支持。通過本文的詳細(xì)介紹,我們不僅掌握了 du 命令的基礎(chǔ)用法和各種選項(xiàng),還深入了解了它在腳本中的應(yīng)用、與其他命令的結(jié)合使用、性能考量以及常見問題的解決方法。
du 命令的簡潔性和高效性使其成為 Linux 用戶和系統(tǒng)管理員的首選工具之一。無論是日常的磁盤監(jiān)控、故障排查,還是復(fù)雜的存儲(chǔ)管理任務(wù),du 命令都能以最小的開銷提供最大的便利。它的跨平臺(tái)兼容性也保證了在不同環(huán)境下的穩(wěn)定使用。
在日常的 Linux 使用和系統(tǒng)管理工作中,du 命令無處不在。它不僅是初學(xué)者入門 Linux 的第一課,也是資深用戶進(jìn)行復(fù)雜任務(wù)時(shí)的得力助手。從簡單的文件大小查看到復(fù)雜的容量規(guī)劃,du 都能以其簡潔優(yōu)雅的方式滿足需求。
記住,掌握 du 命令不僅僅是學(xué)會(huì)如何查看文件和目錄的磁盤占用,更是理解和構(gòu)建 Linux 系統(tǒng)存儲(chǔ)管理生態(tài)的重要一步。在不斷探索和實(shí)踐中,你會(huì)發(fā)現(xiàn) du 命令在各種場(chǎng)景下的無限可能性。它就像一個(gè)磁盤空間的偵探,幫助我們?cè)?Linux 世界的旅程中精準(zhǔn)定位每一個(gè)“磁盤殺手”。
以上就是Linux使用du命令查看文件和目錄的磁盤占用的詳細(xì)內(nèi)容,更多關(guān)于Linux du查看文件和目錄磁盤占用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux創(chuàng)建Shell腳本.sh文件的三種方法
本文詳細(xì)介紹了在Linux系統(tǒng)中創(chuàng)建Shell腳本文件的幾種方法,包括使用vim、nano編輯器和快速創(chuàng)建空文件,同時(shí),強(qiáng)調(diào)了賦予腳本執(zhí)行權(quán)限和建議將腳本放在/usr/local/bin/目錄下的重要性,需要的朋友可以參考下2026-02-02
linux下獲取當(dāng)前時(shí)間的相關(guān)函數(shù)
這篇文章主要介紹了linux下獲取當(dāng)前時(shí)間的相關(guān)函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-09-09
Apache?Linkis?中間件架構(gòu)及快速安裝步驟
作為計(jì)算中間件,Linkis 提供了強(qiáng)大的連通、復(fù)用、編排、擴(kuò)展和治理管控能力,通過計(jì)算中間件將應(yīng)用層和引擎層解耦,簡化了復(fù)雜的網(wǎng)絡(luò)調(diào)用關(guān)系,本文給大家介紹Apache?Linkis?中間件架構(gòu)的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-03-03
Linux下安裝grafana并且添加influxdb監(jiān)控的方法
這篇文章主要介紹了Linux下安裝grafana并且添加influxdb監(jiān)控的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
在Linux中查看所有正在運(yùn)行的進(jìn)程的方法
這篇文章主要介紹了在Linux中查看所有正在運(yùn)行的進(jìn)程的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

