如何通过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年

Answers:


10

使用GNU du(即,在非嵌入式Linux或Cygwin上),您可以使用该--exclude选项排除您不想匹配的文件。

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

如果要肯定匹配*.pdf文件,则需要使用其他方法来列出文件,并且du每个参数至少显示一条输出行,以及带有option的总计-c。您可以呼叫tail以删除除最后一行以外的所有内容,也可以使用sed删除“ total”一词。要枚举该目录中的文件,请在外壳程序中使用通配符。

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)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.