たとえば./photos/john_doe
などのイメージストレージディレクトリがあり、その中に複数のサブディレクトリがあり、そこに特定のファイルが多数あるとします(*.jpg
など)。 john_doe
ブランチの下のこれらのファイルの概要サイズを計算するにはどうすればよいですか?
du -hs ./photos/john_doe/*/*.jpg
を試しましたが、これは個々のファイルのみを示しています。また、これはjohn_doe
のようにjohn_doe/june/
ディレクトリの最初のネストレベルのみを追跡しますが、john_doe/june/outrageous/
はスキップします。
それで、特定のファイルのサイズを合計して、ブランチ全体をトラバースするにはどうすればよいですか?
find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
ファイルリストが非常に長いためにdu
の複数の呼び出しが必要な場合、複数の合計が報告され、合計する必要があります。
du -ch public_html/images/*.jpg | grep total
20M total
.jpg
このディレクトリのファイル。
複数のディレクトリを処理するには、おそらくこれをfind
と組み合わせる必要があります。
duコマンドの例 が役立つかもしれません(find
も含まれます)
主に、次の2つが必要です。
-c
du
のオプション。総計を生成するように指示します。**
( アクティベーション手順 )またはfind
( 例 )またはサブディレクトリをトラバースします。du -ch -- **/*.jpg | tail -n 1
最終的な答えは:
{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc
さらに高速なバージョンで、RAMによる制限はありませんが、GNU AWKとbignumのサポートが必要です。
find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'
このバージョンには次の機能があります。
find
のすべての機能find
はファイル名の単純なワイルドカード照合を行います5.5K
、176.7M
、...)| numfmt --to=si
これまでの回答では、findからduに渡されたファイルリストが長すぎて、リストが自動的にチャンクに分割され、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はnullで終了する文字列を意味します(改行で終了しない)。awk '{sum+=$1} END {print sum}'
:前のコマンドによって出力されたファイルサイズを合計します
参考までに、他の方法はfind . -type f -iname '*.jpg' -print0 | du -c --files0-from=-
GNUシステムで、ファイルのリストが大きすぎてdu -c
の1回の呼び出しに渡せない場合は、次のようにできます。
find . -iname '*.jpg' -type f -printf '%b\t%D:%i\n' |
sort -u | cut -f1 | paste -sd+ - | bc
(512バイトブロックの数で表されるサイズ)。 du
と同様に、ハードリンクを1回だけカウントしようとします。ハードリンクを気にしない場合は、次のように簡略化できます。
(printf 0; find . -iname '*.jpg' -type f -printf +%b) | bc
ディスクの使用量ではなくサイズが必要な場合は、%b
を%s
に置き換えます。サイズはバイト単位で表されます。
これまでに説明したソリューションは非効率的で(execは高価です)、ファイルリストが長い場合や、Mac OS Xで機能しない場合は、合計するために追加の手動作業が必要です。次のソリューションは非常に高速で、どのシステムでも機能するはずです。合計の答えをGBで表示します(合計をMBで表示したい場合は、/ 1024を削除してください):find . -iname "*.jpg" -ls |Perl -lane '$t += $F[6]; print $t/1024/1024/1024 . " GB"'
duは自然にディレクトリ階層をトラバースし、awkはフィルタリングを実行できるため、次のようなもので十分です。
du -ak | awk 'BEGIN {sum=0} /\.jpg$/ {sum+=$1} END {print sum}'
これはGNUなしで動作します。
Zbyszekがコメントですでに指摘したように、SHWの優れた答えを改善して、どのロケールでも機能するようにします。
LC_ALL=C find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
もう一つは
ls -al <directory> | awk '{t+=$5}END{print t}}'
あなたが単一のディレクトリを探していると仮定します。現在のディレクトリとその下を見たい場合
ls -Ral <directory> | awk '{t+=$5}END{print t}}'
これは私のために働いたものです。
find -type f -iname *.jpg -print0 | du -ch --files0-from=- | grep total$
Duではなくstatを使用する他の代替手段
stat -L -c %s ** | awk '{s+=$1} END {printf "%.0f\n", s}'
**の使用に関するGillesの回答をご覧ください