QA@IT

LinuxやMacで複数ファイルの合計サイズを得るには?

12524 PV

LinuxやMacなどUnix環境で、ワイルドカードで指定した複数ファイルの合計サイズを得るにはどうするのがいいでしょうか?

以下のようにファイルがあるとします。

$ tree -sh .
.
├── [7.7M]  bar.txt
├── [5.4M]  foo.txt
├── [9.6M]  hoge.txt
├── [9.7M]  otherfile.txt
├── [ 11M]  readme.txt
├── [348M]  screencast01.m4v
├── [361M]  screencast02.m4v
├── [340M]  screencast03.m4v
├── [432M]  screencast04.m4v
├── [324M]  screencast05.m4v
├── [374M]  screencast06.m4v
├── [290M]  screencast07.m4v
└── [ 102]  test
    └── [348M]  screencast08.m4v

1 directory, 13 files

このとき、screencast*m4v のファイルの合計サイズを知るにはどうすればいいですか?

回答

wc -c screencast*m4v

です。個々のファイルのサイズも表示しますが、結果だけ欲しかったら grep や sed などで加工すれば良いかと思います。

編集 履歴 (0)
  • おお、Word Countといいながら、ファイルのバイト数とかも数えてくれるんですね。知りませんでした。 -
  • 蛇足ですが、find, xargsを組み合わせるとtestディレクトリ以下も表示できますね。

    find . -name "screencast*m4v" | xargs wc -c
    -
  • そうなんですが、最近どうもパイプで複数コマンドを使わなくて済む強力コマンドが増えている気がしていたのでした。というのが du の -c で驚いたことでした。本来、-h だって、もしかしたらUnix的にはやらなくていいことかもしれませんよね。cutしてhum(anize)するみたいなコマンドがあれば。 -
  • あれ、-cはバイト数じゃなくて文字数じゃなかったっけ? と確認したら、バイト数で正しいようでした。 -

こういうのはパイプを使って、

$ ls -ls screen*m4v | awk '{sum = sum + $6} END {print sum}'
2588903716

とやるのが定石だったような気がしますが、実は du コマンド一発で済むのですね。

$ du -hc screencast0*
348M    screencast01.m4v
361M    screencast02.m4v
340M    screencast03.m4v
432M    screencast04.m4v
324M    screencast05.m4v
374M    screencast06.m4v
290M    screencast07.m4v
2.4G    total

hオプションは、Human readableということで人間に読みやすい単位で表示していて、cは合計値を求めるオプションです。これは調べた限り、MacのBSD系のduでもLinuxのGNU Coreutilsに含まれるduでも同様です。

サブディレクトリも含めることができます。

du -hc **/screencast0*
348M    screencast01.m4v
361M    screencast02.m4v
340M    screencast03.m4v
432M    screencast04.m4v
324M    screencast05.m4v
374M    screencast06.m4v
290M    screencast07.m4v
348M    test/screencast08.m4v
2.8G    total

【追記】
ちなみに、MacのFinder だと、複数ファイルを選択した状態で Alt-Cmd-i とすれば、インスペクタに合計値が出ます。さらに、その状態でファイルの選択状態を変えると、それにともなって数値も変わります。(sora_hさん、情報ありがとうございます)

編集 履歴 (1)
  • いえいえ〜(▰╹◡╹) -
ウォッチ

この質問への回答やコメントをメールでお知らせします。