如何通过“du”命令仅显示特定扩展名的总文件大小

如何通过“du”命令仅显示特定扩展名的总文件大小

我的目录中有数百个 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

使用 GNUfinddu

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

相关内容