web-dev-qa-db-ja.com

duを使用すると、引数リストが長すぎます

特定のフォルダで大きなファイルを見つけるコマンドを持っていますが、何らかの理由で特定の状況では機能せず、「引数リストが長すぎます」というエラーが表示されます。このコマンドを修正して毎回機能するようにするにはどうすればよいですか?

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

そのコマンドをグロビングの代わりにfindで置き換えてそれを行うことができます

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

find+表記をサポートしていると仮定します。

これにより、現在のディレクトリの下にあるすべてがより深く下降することなく検索され、「。」は無視されます。 (そのリマインダー@rudimeierに感謝!)

これには、元々あったグロブのように、現在のディレクトリにあるすべてのファイルが含まれます。そのグロブとは異なり、これは.で始まるファイルも検索します(すでにdotglobを有効にするシェルオプションで遊んでいた場合を除く)。

6
Eric Renouf

duを使用して「引数リストが長すぎる」を処理する方法を探しているときに、この質問にたどり着きました。私の場合、出力をフィルタリングするのではなく、パターンに一致するすべてのファイルの合計を取得する必要がありました。他の質問のアプローチでは、引数のサブセットを使用してduを数回呼び出すため、総計を取得できませんでした。

解決策は、引数としてファイル名を渡す代わりに_--files0-from=_を使用することでした。

最後にこれは私のために働きました:

_du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
_
  • _-L_検索とサイズ計算の両方でシンボリックリンクをたどります。
  • _-c_累計を取得
  • <()プロセス置換fileをその場で作成
  • _-print0_はduの期待に一致します
  • \( \) __-o_を2つの_-name_引数で使用できるようにする

同様に、上記の質問に対する答えは次のようになります。

_du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10
_
4
unode
Sudo ls | Sudo parallel -j1 du -hsx | sort -rh | head -10
1
Ole Tange

GNU coreutilsの最近のバージョンでは、--max-depthでファイルを列挙する代わりに *オプション を使用できます。これにより、ファイルが多すぎると、コマンドラインの長さの制限に達する危険があります。--min-depthがないため、最上位のディレクトリが最後に表示されます。

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

これは、コマンドラインのサイズと引数の数が無制限ではないという一般的な問題です。これらを回避する一般的な方法は、find/xargsパイプを使用することを制限します。

あなたのケースは次のように機能するはずです:

 Sudo sh -c "find . -mindepth 1 -maxdepth 1 -print0 |xargs -0 du -hsx -- " |sort -rh |head

Sudo要件により、通常よりも少しトリッキーに見えます。

0
rudimeier