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とは異なり、これは.(すでに有効にするためにシェルオプションを使用しない限りdotglob)で始まるファイルも探します。

答え2

「パラメータリストが多すぎる」の処理方法を探しているときにこの問題が発生しましたdu。私の場合は、出力をフィルタリングせずにパターンに一致するすべてのファイルの総数を取得したいと思います。他の質問のメソッドを使用すると、引数のduサブセットを使用して複数回呼び出されるため、合計を取得できません。

解決策は、--files0-from=ファイル名をパラメータとして渡す代わりに使用することです。

最後に、これは私にとって効果的でした。

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -Lルックアップとサイズの計算の両方でシンボリックリンクに従います。
  • -c累積合計を取得する
  • <()fileダイナミクスを生み出すためのプロセス交換
  • -print0du期待に応える
  • \( \)-o2つの-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

関連情報