受け入れられた回答にはいくつかの潜在的な問題があります。
- サブディレクトリに分類されません(のような非標準のシェル機能に依存することなく
globstar
)
- 一般に、以下のDennis Williamsonが指摘しているように、次の出力の解析は避ける必要があります。
ls
- つまり、ユーザーまたはグループ(列3および4)にスペースが含まれている場合、列5はファイルサイズになりません。
- そのようなファイルが100万個ある場合、これにより200万個のサブシェルが生成され、遅くなります。
ghostdog74によって提案されているように、GNU固有の-printf
オプションを使用しfind
て、より堅牢なソリューションを実現し、過剰なパイプ、サブシェル、Perl、および奇妙なdu
オプションをすべて回避できます。
# the '%s' format string means "the file's size"
find . -name "*.txt" -printf "%s\n" \
| awk '{sum += $1} END{print sum " bytes"}'
はい、はい、paste
またはを使用したソリューションbc
も可能ですが、これ以上簡単ではありません。
macOSでは、HomebrewまたはMacPortsを使用してインストールし、代わりにfindutils
呼び出す必要があります。gfind
(この質問には「linux」タグがありますが、「unix」というタグも付いています。)
GNUがなくfind
ても、次の使用にフォールバックできますdu
。
find . -name "*.txt" -exec du -k {} + \
| awk '{kbytes+=$1} END{print kbytes " Kbytes"}'
…しかし、歴史的な理由からdu
、デフォルトの出力は512バイトブロックであるという事実に注意する必要があり(マニュアルページの「根拠」セクションを参照)、一部のバージョンdu
(特にmacOS)にはサイズをバイト単位で出力するオプション。
ここにある他の多くの優れたソリューション(特にBarnの回答を参照)ですが、ほとんどの場合、不必要に複雑であるか、GNUのみの機能に過度に依存しているという欠点があります。おそらく、ご使用の環境では問題ありません。