特定のフォルダで大きなファイルを見つけるコマンドを持っていますが、何らかの理由で特定の状況では機能せず、「引数リストが長すぎます」というエラーが表示されます。このコマンドを修正して毎回機能するようにするにはどうすればよいですか?
jbsmith:/tmp$ Sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/Sudo: Argument list too long
そのコマンドをグロビングの代わりにfind
で置き換えてそれを行うことができます
Sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10
find
が+
表記をサポートしていると仮定します。
これにより、現在のディレクトリの下にあるすべてがより深く下降することなく検索され、「。」は無視されます。 (そのリマインダー@rudimeierに感謝!)
これには、元々あったグロブのように、現在のディレクトリにあるすべてのファイルが含まれます。そのグロブとは異なり、これは.
で始まるファイルも検索します(すでにdotglob
を有効にするシェルオプションで遊んでいた場合を除く)。
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
_
Sudo ls | Sudo parallel -j1 du -hsx | sort -rh | head -10
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
要件により、通常よりも少しトリッキーに見えます。