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


11

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

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

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

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


こんな風に使えdu -sh /foo/*.pdfますか?
bagavadhar 2014年

2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti 2014年

回答:


10

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

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

*.pdfファイルを確実に照合する場合は、他の方法を使用してファイルを一覧du表示する必要があります。少なくとも、引数ごとに1つの出力行と、オプション付きの総計が表示されます-c。を呼び出しtailて、最後の行を除くすべてを削除するか、sedを使用して「total」という単語を削除することもできます。その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

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

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

(実際しかし、ノートでは、おそらくいない問題が--exclude='*.html'原因となる/var/foo/dir.html/foo.pdf除外はまた、ディレクトリトラバーサルに影響を与えるとしてカウントされない。また、を含むディレクトリのディスク使用量/var/foo自体が計上されるだろう)
ステファンChazelas

3

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

$ 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


du各ファイルのディスク使用量を示します(ほとんどのファイルシステムでは、ファイルサイズはブロックサイズの次の倍数に切り上げられます)。オプションを使用すると-bdu各ファイルのサイズが表示されます。
Gilles「SO-邪悪なことをやめなさい」2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.