我的目录中有数百个 pdf 文件和 html 文件。我想知道 pdf 文件的总大小。
通过命令du -ch /var/foo
我可以看到总文件大小,但我只需要最后一行,即总大小。
如果目录只包含pdf文件我可以使用-s
选项,但这次不能使用该选项。
如何仅获取特定文件类型的总大小?
答案1
对于 GNU du
(即在非嵌入式 Linux 或 Cygwin 上),您可以使用该--exclude
选项来排除您不想匹配的文件。
du -s --exclude='*.html' /var/foo
如果您想积极匹配*.pdf
文件,则需要使用其他方法来列出文件,并且du
至少为每个参数显示一个输出行,以及带有选项的总计-c
。您可以调用tail
来删除除最后一行之外的所有内容,或者使用 sed 来删除单词“total”。要枚举该目录中的文件,请在 shell 中使用通配符。
du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'
如果您还需要遍历子目录中的文件,请使用find
,或者使用**/
模式(如果您的 shell 支持)。对于**/
,在 bash 中,首先运行shopt -s extglob
,并注意 bash 版本高达 4.2 将遍历目录的符号链接;在 zsh 中,这是开箱即用的。
du -sc /var/foo/**/*.pdf | tail -n1
find 版本的一个额外的复杂性是,如果文件太多,find
将运行du
多次,以保持在命令行长度限制之下。使用通配符方法,如果发生这种情况,您将收到错误(“超出命令行长度限制”)。以下代码假设您没有任何包含换行符的匹配文件名。
find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
答案2
您可以让 shell 扩展文件:
$ 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
您可以使用“find”命令来获取这样的结果,在这个问题的答案中找到:
答案4
使用 GNUfind
和du
:
LC_ALL=C find . -iname '*.pdf' -type f -print0 |
du -ch --files0-from=- |
tail -n 1
用于名称以 ( , ...)结尾.pdf
或任何变体的所有常规文件的累积磁盘使用量。.PDF
.pdF
对于文件大小的总和(计算同一文件的所有硬链接)而不是磁盘使用量,即可以从所有文件中读取多少数据,请将 和 选项添加到--count-links
,--apparent-size
或者du
您可以使用du -lbch
代替du -ch
。 (正如-b
暗示的那样--apparent-size
)。如果您还想计算 PDF 文件的符号链接数,请更改-type
为-xtype
并添加该--dereference-args
选项。du