我有一個大約 100 萬個資料夾的路徑,總大小為 300GB。當我運行該du -sh *
命令時,出現標題中提到的錯誤。我如何結合使用xargs
此命令或將xargs
解決我的問題?但是,我仍然需要一個單獨的命令來查找同一路徑下大於 20GB 的資料夾。需要幫助才能使用這兩個命令。
路徑範例:/data/dataold/exports/
輸出應如下所示(您可以將我在下面所說的內容視為我在上一行指定的主路徑下的文件和資料夾名稱):
4.0K xyz.sh 12K asdasda.txt 10G QWERT 1G ASDFGH
此致。
答案1
一種選擇是使用find
,但我建議使用如下所示的其他解決方案之一。
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \;
假設/data/dataold/exports
包含子目錄
foo
bar
baz
(也許更多),它將運行
du -sh /data/dataold/exports/foo
du -sh /data/dataold/exports/bar
du -sh /data/dataold/exports/baz
ETC。
選項-mindepth
避免執行du
指令 for /data/dataold/exports
,並-maxdepth
避免對子目錄的子目錄執行指令,例如 for /data/dataold/exports/foo/something
。
正如建議的CAS' 評論,你可以使用
find /data/dataold/exports -mindepth 1 -maxdepth 1 -exec du -sh {} \+
而不是... -exec du -sh {} \;
,如果您的版本find
支援此功能。使用+
代替;
,每次 linux arg 緩衝區被填滿(大約 2MB)時find
都會執行一次,而不是為每個檔案/目錄執行一次。du
前者是很多快點。
引用史蒂芬·查澤拉斯' 註釋:“請注意,如果這些頂級目錄之間存在硬鏈接,則調用多個獨立的調用du
(例如 with )可能會給出不同的數字,因為如果通過不同的調用找到它們,則不會對它們進行重複資料刪除。find -exec
du
使用 GNU,您可以使用選項或 來du
限制要顯示的深度:-d
--max-depth=N
du -h -d 1 /data/dataold/exports
這將對所有子目錄進行計算,但將輸出限制為起點以下的深度 1,因此在上面顯示的範例中,它應該會列印總大小
/data/dataold/exports/foo
/data/dataold/exports/bar
/data/dataold/exports/baz
等等以及對於
/data/dataold/exports
第二種解決方案(如果可用)應該是首選,因為它不需要du
為每個子目錄(在 的情況下-exec ... \;
)或填充參數緩衝區的每組子目錄(在 的情況下-exec ... \+
)啟動新進程。
如果您的版本du
不支援-d
您可以使用的選項
du -h /data/dataold/exports
並過濾輸出以刪除第一層子目錄以下的所有內容。
如果您想透過數字比較來過濾輸出,我建議省略該選項-h
。為了避免在測試過濾時等待緩慢的文件系統訪問,我建議將輸出重定向到文件,例如
du -d 1 /data/dataold/exports > outputfile
或者
du -d 1 /data/dataold/exports 2>errors | tee outputfile
並處理後面的內容outputfile
。
例子:
awk '$1 > 20e9` outputfile
如果您du
不支援選項,-d
您可以使用類似的選項
du /data/dataold/exports > outputfile
awk '$1 > 20e9 && $1 != /\/.*\/.*\/.*\/.*\/.*/` outputfile
這將列印第一個欄位中數字大於 20 * 10^9 且第二個欄位中不包含 5 個(或更多)斜線的值的所有行。第二個條件中的斜杠數量是根據起始目錄定制的/data/dataold/exports
,並且將打印eg/data/dataold/exports/foo
但不打印eg /data/dataold/exports/foo/bar
。
答案2
盡量不要總結然後讓du
工作去做。sort
按照uman 訂單申請-h
,然後將其限制在特定尺寸:
du -h /data/dataold/exports/ | sort -h
用於按-r
相反sort
順序列出,即從大到小文件。
要選擇尺寸,awk
可以使用一個簡單的技巧:
du -h /data/dataold/exports/ | awk -F'G' '$1~/^[0-9]+$/ && $1>=20' | sort -h
即:使用G
(來自 GB 大小輸出)作為欄位分隔符,檢查欄位是否僅為數字(以排除與 G 分隔符號的錯誤匹配),然後僅選擇大於 20 的數字。此處排序是可選的。