Find
為什麼我的“find -exec du”不起作用?
我想獲取目錄樹的磁碟使用情況,不包括以“。”開頭的分支,我最終希望通過 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 .
將同時顯示
somedir
and ,.
並且不會計入somedir
..
您的
find
命令最終包括.
,所以這就是您所看到的,因為它首先出現。您可以通過指定最小深度來避免這種情況;然後您將看到目前目錄下所有目錄的總數。如果這就是你想要的,那麼
du -sh */
將產生相同的結果,而不使用
find
.如果你想要詳細的、每個目錄的輸出,你需要告訴
find
深度優先列出目錄;-prune
那時不起作用,但對路徑進行過濾可以:find . -mindepth 1 -depth -type d \! -path '*/.*' -exec du -sh {} +
(請注意,隱藏目錄的大小仍將計入任何非隱藏父目錄的大小。)
如果您的
du
支持--exclude
,您可以使用它來達到相同的效果:du -h --exclude '*/.*' ./