web-dev-qa-db-ja.com

「du」コマンドで特定の拡張子の合計ファイルサイズのみを表示する方法

ディレクトリに何百ものpdfファイルとhtmlファイルがあります。そして、私はPDFファイルの合計サイズを知りたいです。

コマンドdu -ch /var/fooファイルの合計サイズを確認できますが、必要なのは最後の行の合計サイズだけです。

ディレクトリにpdfファイルのみが含まれている場合、-sオプションですが、今回は使用できません。

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

11
ironsand

GNU du(つまり、組み込みでないLinuxまたはCygwin)では、--excludeオプションを使用して、一致させたくないファイルを除外できます。

du -s --exclude='*.html' /var/foo

*.pdfファイルを確実に一致させる場合は、他の方法を使用してファイルを一覧表示する必要があります。duは、引数ごとに少なくとも1つの出力行と、オプション-ctailを呼び出して、最後の行を除くすべてを削除するか、sedを使用してWordの「合計」を削除することもできます。その1つのディレクトリ内のファイルを列挙するには、シェルでワイルドカードを使用します。

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

サブディレクトリのファイルもトラバースする必要がある場合は、findを使用するか、シェルがサポートしている場合は**/パターンを使用します。 **/の場合、bashで最初にshopt -s extglobを実行します。4.2までのbashバージョンは、ディレクトリへのシンボリックリンクを通過することに注意してください。 zshでは、これはそのまま使用できます。

du -sc /var/foo/**/*.pdf | tail -n1

検索バージョンでさらに複雑になるのは、ファイルが多すぎる場合、findduを複数回実行して、コマンドラインの長さの制限を維持することです。ワイルドカードメソッドを使用すると、それが発生するとエラーが発生します(「コマンドラインの長さの制限を超えました」)。次のコードは、改行を含む一致するファイル名がないことを前提としています。

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'

シェルにファイルを展開させることができます。

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

ただし、これを見るとわかるように、ファイルサイズは作成直後の約1000倍です。より良いオプションは-bオプションを使用することです:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

大きなファイルサイズは、人間が読める形式で表示されます。 173K

3
Anthon