Find

為什麼我的“find -exec du”不起作用?

  • November 23, 2021

我想獲取目錄樹的磁碟使用情況,不包括以“。”開頭的分支,我最終希望通過 ssh 執行它,所以我更喜歡不使用管道。當我執行以下命令時,我得到了所有目錄的列表:

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/echo -sh {} + \)
-sh ./dir-1 ./dir-2 ./dir-3 [...]

當我自己執行 du 時,我得到了預期的輸出:

> /bin/du -sh ./dir-1 ./dir-2 ./dir3 [...]
11M     ./dir-1
254K    ./dir-2
15M     ./dir-3
[...]

當我將兩者結合時,我只得到總行:

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/du -sh {} + \)
1.4G    .

順便說一句,我正在執行 Oracle Linux Server 版本 7.9 和 GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)

總結時,du只計算一次目錄——所以

du -sh . somedir

只會顯示.,因為somedir是佔中的.。順序很重要,所以

du -sh somedir .

將同時顯示somedirand ,.並且不會計入somedir..

您的find命令最終包括.,所以這就是您所看到的,因為它首先出現。您可以通過指定最小深度來避免這種情況;然後您將看到目前目錄下所有目錄的總數。

如果這就是你想要的,那麼

du -sh */

將產生相同的結果,而不使用find.

如果你想要詳細的、每個目錄的輸出,你需要告訴find深度優先列出目錄;-prune那時不起作用,但對路徑進行過濾可以:

find . -mindepth 1 -depth -type d \! -path '*/.*' -exec du -sh {} +

(請注意,隱藏目錄的大小仍將計入任何非隱藏父目錄的大小。)

如果您的du支持--exclude,您可以使用它來達到相同的效果:

du -h --exclude '*/.*' ./

引用自:https://unix.stackexchange.com/questions/678757