網站目錄佔了不少空間,跑du -sh ./*卻只看到幾個小目錄?先別認定du算錯。在一般Bash設定下,星號展開不會包含名稱以點開頭的項目;像.cache、.git這些目錄,可能根本沒被交給du統計。
先看星號實際展開了什麼
到要檢查的目錄,先確認所在位置,再列出./*代表的路徑。下面只顯示位置與名稱,不會修改檔案。
pwd
printf '%s\n' ./*
假設目錄裡有visible和.cache兩個子目錄,Bash未啟用dotglob時,這個星號通常只展開成./visible。接著執行du -sh -- ./*,du收到的也只有那個路徑。.cache沒有出現在結果中,不是du先讀取後把它排除,而是shell沒有把它列進參數。
不同shell或自訂設定可能改變展開結果;若星號沒有匹配到項目,顯示原樣或報錯也可能和設定有關。先看實際路徑,不要把某台主機的習慣當成所有Linux環境的固定行為。
要算整個目前目錄,就直接指定點
想知道目前目錄總共佔多少空間,不必把星號改成一長串隱藏檔案模式。直接把目前目錄.交給du:
du -sh -- .
-s彙總指定路徑,-h用容易閱讀的單位顯示。du會從這個目錄往下統計,名稱以點開頭的子目錄也在範圍內。輸出最後的點代表整個目前目錄,不是單獨一個普通檔案。
再找出哪一個子目錄較大
在提供GNU du的Linux環境,可把顯示層級限制在下一層。這條仍然以目前目錄為起點,而不是使用星號列出普通名稱。
du -h --max-depth=1 -- .
結果會列出第一層子目錄,以及最後的目前目錄總量;符合範圍的.cache也會顯示。--max-depth=1限制的是顯示深度,不代表只讀一層就能算完:子目錄裡的內容仍需要統計,大型目錄照樣可能花時間與I/O。
這個寫法不會替你把每個第一層普通檔案逐一列出。若某個大檔案直接放在目前目錄,總量會包含它,子目錄那幾行相加卻不一定等於總量。不要把這個差額全當成隱藏目錄。
用小例子對照兩種範圍
假設visible裡放一個4KiB檔案,.cache裡放一個1MiB檔案。一般Bash的./*只列visible,沿用它的du結果就不會反映那個1MiB隱藏檔案;改成du -sh -- .,總量會把兩邊都納入。再用上一節的層級顯示,就能看出.cache比visible大。
這裡的檔案大小只是示例,du通常顯示磁碟配置用量;目錄本身、檔案系統配置方式及工具的單位設定,都可能讓顯示值和檔案內容長度不同。重點是比較同一位置、同一工具下的統計範圍,而不是要求輸出剛好等於兩個數字相加。
數字還是對不上時
留意權限不足的錯誤,掃描期間檔案是否持續變動,以及目錄裡有沒有掛載其他檔案系統。上面的指令沒有要求停在同一檔案系統,不能直接拿它的總量和某一個掛載點的df數字畫等號。GNU選項也不保證適用於BusyBox或macOS的du。
找到大目錄後先確認用途和保留規則。快取、版本庫、上傳檔案或備份需要不同處理方式;名稱以點開頭不代表可以刪。這次先把統計範圍查清楚,再決定是否有需要安排清理。

評論0