題 如何獲取目錄及其子目錄的匯總大小?


假設我想獲得Linux文件系統的每個目錄的大小。我用的時候 ls -la 我真的沒有得到文件夾的匯總大小。

如果我使用 df 我得到每個安裝的文件系統的大小,但這也沒有幫助我。與 du 我得到每個子目錄的大小和整個文件系統的摘要。

但我希望只有文件系統的ROOT文件夾中每個目錄的匯總大小。是否有任何命令來實現這一目標?


266
2017-07-11 17:26


起源


該 --total 國旗對我有幫助。例如。 du -sh --total applications/*。 askubuntu.com/a/465436/48214 - Ryan


答案:


這就是你要找的東西:

du -sh /*

這意味著什麼:

  • -s 僅給出每個命令行參數的總數。
  • -h 對於人類可讀的後綴,如 M 對於兆字節和 G 為千兆字節(可選)。
  • /* 只需擴展到所有目錄(和文件) /

    注意:不包括dotfiles;跑 shopt -s dotglob 包括那些。

同樣有用的是按大小排序:

du -sh /* | sort -h

這裡:

  • -h 確保這一點 sort 正確解釋人類可讀的後綴。

374
2017-07-11 17:28



如果根目錄中有點目錄,則可以使用 shopt -s dotglob 將它們包括在計數中。 - Philipp
它非常有用,因為它很簡單,你可以放置你想要的路徑而不是 /*,例如 ./ 對於當前目錄或 ./* 對於當前目錄中的每個項目。 - psur
@psur或者你可以使用 ./*/ 只獲取子文件夾而不是所有項目 - relascope
分類版本: du -sh /* | sort -h - Vu Anh
@ c1phr如果你的 sort 沒有 -h,你需要離開它 du 此外,排序將混合千克/兆/千兆字節。 du -s /* | sort -nr。 - Thomas


我經常需要找到最大的目錄,所以要獲得一個包含20個最大目錄的排序列表,我這樣做:

du -m /some/path | sort -nr | head -n 20

在這種情況下,將以兆字節為單位報告大小。


71
2017-07-29 12:07



這是一種讓它更具可讀性的方法du -sh / some / path | sort -hr |頭 - 20 - Xedecimal
@Xedecima使用h的問題是排序不知道如何處理不同的大小。例如,268K的排序高於255M,並且兩者的排序均高於2.7G - chrisan
'sort'命令中的-h(人類可讀)參數應正確讀取這些值。就像du的-h標誌出口它們一樣。取決於你正在運行什麼我猜。 - Xedecimal
適用於Ubuntu 16.04。不錯的提示。 - SDsolar
sudo du -haxt 1G / | sort -hr |頭-30 - deviant


我喜歡用 Ncdu 為此,您可以使用光標導航和深入查看它工作得非常好的目錄結構。


15
2017-12-24 10:07





現有的答案非常有用,也許一些初學者(像我一樣)會發現這也很有幫助。

  1. 非常基本的循環,但對我來說這是一些其他大小相關操作的良好開端:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. 非常類似於第一個答案和幾乎相同的結果1.),但是如果在子目錄中,我花了一些時間來理解*到./*的區別:

    du -sh ./*
    

9
2017-11-22 16:53





下列 du 調用應該適用於BSD系統:

du -d 1 /

6
2017-07-11 17:29



我的 du (Ubuntu 10.4)沒有 -d 選項。你在用什麼系統? - Thomas
在我的openSUSE上它也沒有-d選項:( - 2ndkauboy
好的,那麼它只是一個BSD選項(我在OS X上)。 - Philipp
BSD / * NIX上的右側便攜式選項組合是 du -sk /*。我討厭 -k 東西太多了。 Linux的 -h 完全是岩石。 - Dummy00001
在其他系統中,它 --max-depth - Vishnu Kumar


這並不容易。該 du 命令顯示文件和文件夾(默認)或僅顯示在命令行上指定的所有項目的大小(選項 -s)。

要在Linux上獲取具有人類可讀大小的最大項目(文件和文件夾),已排序:

du -h | sort -h

這會把你埋在一大堆小文件中。你可以擺脫他們 --threshold (在我的示例中為1 MB):

du --threshold=1M -h | sort -h

此命令的優點是它包含隱藏的點文件夾(以文件夾開頭的文件夾) .)。

如果你真的只想要文件夾,你需要使用 find 但是這可能非常非常緩慢 du 將不得不多次掃描多個文件夾:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

3
2017-07-24 11:04



--threshold ^^^這個選項在linux上不可用 - podarok
@podarok它可以在OpenSUSE 13.2 Linux上使用。嘗試查找更新版本的發行版或自行編譯更新版本的軟件包。 - Aaron Digulla
它不適用於Ubuntu LTS(14.04)。這是最近的一個)) - podarok
@podarok哪個版本的GNU coreutils?我的是8.24。 - Aaron Digulla
緩存可能是一個糟糕的術語。我在想這個端口做的事情 superuser.com/a/597173/121352 我們將磁盤內容掃描一次到映射中,然後繼續使用該映射中的數據而不是再次訪問磁盤。 - Hennes


請注意,您無法與目錄進行比較 du 在不確定的系統/機器上,兩者共享文件系統的相同塊大小。如果您將某些文件從Linux機器同步到nas並且您想要自己比較同步目錄,這可能會有效。您可能會得到不同的結果 du 因為不同的塊...


1
2017-10-05 15:36





您可能還想看看 xdiskusage。會給你相同的信息,但以圖形方式顯示,加上允許向下鑽取(非常有用)。 KDE甚至Windows還有其他類似的實用程序。


0
2017-07-12 19:42





你可以用 ls 和這個結合 awk

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

的輸出 ls 用管道輸送 awkawk 開始處理數據。標準分隔符是空間。和變量 tot 初始化為零;對於輸出的每一行/每行執行以下語句 ls。它只是遞增 tot 與大小。 $5 代表第五列(由...輸出) ls)。最後,我們除以(1024 * 1024)總和,以兆字節為單位。

如果要將其轉換為腳本或函數(.bashrc),您還可以根據文件類型使用它來獲取某些目錄子集的大小。

如果您想要係統範圍的信息, kdirstat 可能會派上用場!


0
2017-12-20 09:56



我同意可以擴展這個例子並做一些技巧,例如獲取“某些目錄子集,根據文件類型”等的大小;這似乎是一個很好的起點。然而,這種解決方案從一開始就存在缺陷。對於每個想要使用此方法的用戶,我建議您閱讀答案和評論 這個問題 以及 文章鏈接在那裡。我不是說你完全不能這樣做。知道這些局限性,就是這些。 - Kamil Maciorowski