web-dev-qa-db-ja.com

特定の拡張子のすべてのファイルの合計サイズを取得します

特定のフォルダー内のすべてのJPEGの合計サイズを取得しようとしていますが、duにパイプしている間、オプションの組み合わせが少ないため、これは機能しないようです。

find -type f -iname "*.jpg" | du -sch
166G    .
166G    total

それらはすべて、ディレクトリ内のすべてのファイルの合計を出力します。

duに渡すファイルの合計ファイルサイズのみを取得するにはどうすればよいですか?

1
Prometheus

質問からわかるように、ディレクトリが1つしかない場合、最も簡単な方法は、配管を完全に回避し、代わりに実行することです。

du -sch *.jpg

1
Christian Seitz

ファイルを引数としてduを呼び出すと、引数文字列の長さ(数千ファイル)(*)によって制限されます。大量のファイルが予想される場合は、--files0-from=F引数を使用してリストファイルでファイルを指定する必要があります(標準入力には-を使用できます)。

find . -name '*.JPG' -print0 | du -msc --files0-from -

(*)また、... | xargs du -cを使用しても、xargsはファイルリストをバッチで切り刻み、duを数回呼び出すため、合計が複数になるため、役に立ちません。

1
xenoid

ここで単にduにパイプするだけではうまくいかない理由はわかりませんが(理由を詳しく説明した回答を投稿してください)、-execを使用してduを実行するとうまくいくことがわかりました。動作し、+構文でも非常に高速です。

find -type f -iname "*.mov" -exec du -ch {} +

これにより、特にファイルの列挙にfindをすでに使用していたため、これまでの配管よりもはるかに効率的になります。また、どのような場合でも、JPEGファイル拡張子と一致します。

上記は、最終的に合計自体を印刷する前に、各ファイルを個別のサイズで印刷することに注意してください。印刷するにはのみすべてのファイルの合計ファイルサイズは、次を使用します。

find -type f -iname "*.mov" -exec du -ch {} + | tail -n1
0
Prometheus