Oracle Linux 6.7 -bash:/usr/bin/du:參數清單太長

Oracle Linux 6.7 -bash:/usr/bin/du:參數清單太長

我有一個大約 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 -execdu


使用 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 的數字。此處排序是可選的。

相關內容