![du を使用する場合、引数リストが長すぎます](https://rvso.com/image/97215/du%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E5%BC%95%E6%95%B0%E3%83%AA%E3%82%B9%E3%83%88%E3%81%8C%E9%95%B7%E3%81%99%E3%81%8E%E3%81%BE%E3%81%99.png)
特定のフォルダー内の大きなファイルを検索するコマンドがあるのですが、何らかの理由で特定の状況では機能せず、「引数リストが長すぎます」というエラーが表示されます。このコマンドを常に機能するように修正するにはどうすればよいですか?
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
即座に-print0
du
の期待に応える\( \)
2つの引数-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