使用 du 時參數列表太長

使用 du 時參數列表太長

我有一個命令可以在特定資料夾中查找大文件,但由於某種原因,它在某些情況下不起作用,並且出現“參數列表太長”錯誤。如何修復此命令以便它每次都有效?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

答案1

您可以將該命令替換為find而不是通配符並執行此操作

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

假設您find支持該+表示法。

這將找到當前目錄下的所有內容,而無需深入查找,並忽略“.”。 (感謝@rudimeier 的提醒!)

這將包括當前目錄中的所有文件,就像您最初的 glob 一樣。與該 glob 不同,這也會尋找以 開頭的檔案.(除非您已經在使用 shell 選項來啟用dotglob)。

答案2

我在尋找一種方法來處理“參數列表太長”時遇到了這個問題du。就我而言,我不想過濾輸出,而是取得與模式相符的所有檔案的總數。使用其他問題中的方法,我無法獲得總計,因為它們最終會du使用參數的子集多次呼叫。

解決方案是使用--files0-from=而不是傳遞檔案名稱作為參數。

最後這對我有用:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -L在查找和大小計算中都遵循符號連結。
  • -c取得累計總數
  • <()流程替換以建立file動態
  • -print0符合du預期
  • \( \)能夠-o與兩個-name參數一起使用

同樣,上述問題的答案可以是:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10

答案3

使用最新版本的 GNU coreutils,您可以使用--max-depth選項而不是用 . 枚舉文件*。這樣,如果檔案太多,您就不會遇到命令列長度限制的風險。沒有--min-depth,因此頂級目錄將列在最後。

du -x -d 1 | head -n -1 | sort -r | head -n 10

答案4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

相關內容