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