ディレクトリブランチ内の特定のファイルの合計サイズを見つける

ディレクトリブランチ内の特定のファイルの合計サイズを見つける

たとえば、 というイメージ保存ディレクトリがあり、./photos/john_doeその中に複数のサブディレクトリがあり、そこに特定のファイルが多数保存されているとします (たとえば、*.jpg)。ブランチの下のファイルの合計サイズを計算するにはどうすればよいでしょうかjohn_doe

を試してみましたdu -hs ./photos/john_doe/*/*.jpgが、これは個々のファイルのみを表示します。また、これはjohn_doeと同様にディレクトリの最初のネスト レベルのみを追跡しますjohn_doe/june/が、 はスキップしますjohn_doe/june/outrageous/

では、ブランチ全体を走査して、特定のファイルのサイズを合計するにはどうすればよいでしょうか?

答え1

find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$

duファイル リストが非常に長いために を複数回呼び出す必要がある場合は、複数の合計が報告され、それらを合計する必要があります。

答え2

du -ch public_html/images/*.jpg | grep total
20M total

.jpgこのディレクトリ内のファイルの合計使用量を表示します。

複数のディレクトリを処理するには、おそらくこれをfind何らかの方法で組み合わせる必要があります。

あなたは見つけるかもしれないdu コマンドの例役に立つ(以下も含まれますfind

答え3

主に、次の 2 つが必要です。

  • 総計を算出するように指示する-cオプション。du
  • どちらか**アクティベーション手順) またはfind) またはサブディレクトリを移動します。
du -ch -- **/*.jpg | tail -n 1

答え4

これまでの回答では、find から du に渡されるファイル リストが非常に長い場合があり、find が自動的にリストをチャンクに分割し、 が複数回発生する可能性があることが考慮されていませんtotal

手動で合計するか (ロケール!)、別のコマンドを使用することもできますgrep total。私の知る限り、find で見つかったすべてのファイルの合計 (キロバイト単位) を取得する方法は 2 つしかありません。
find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'

説明
find . -type f -iname '*.jpg' -print0: 大文字と小文字を区別せずに拡張子が jpg のすべてのファイル (つまり *.jpg、*.JPG、*.Jpg...) を検索し、それらを出力します (ヌル終端)。:
xargs -r0 du -a-r: Xargs は引数が渡​​されなくてもコマンドを呼び出しますが、-r はこれを防ぎます。-0 はヌル終端文字列 (改行ではない) を意味します。
awk '{sum+=$1} END {print sum}': 前のコマンドによって出力されたファイル サイズを合計します

参考までに、他の方法は
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-

関連情報