iro*_*and 11 shell disk-usage wildcards
我在一个目录中有数百个 pdf 文件和 html 文件。我想知道pdf文件的总大小。
通过命令,du -ch /var/foo我可以看到总文件大小,但我只需要最后一行,即总大小。
如果目录只包含pdf文件我可以使用-s选项,但这次不能使用该选项。
如何仅获取特定文件类型的总大小?
Gil*_*il' 10
使用 GNU du(即在非嵌入式 Linux 或 Cygwin 上),您可以使用该--exclude选项排除您不想匹配的文件。
du -s --exclude='*.html' /var/foo
Run Code Online (Sandbox Code Playgroud)
如果您想正确匹配*.pdf文件,则需要使用其他方法来列出文件,并且du每个参数至少显示一个输出行,加上选项-c. 您可以调用tail删除除最后一行之外的所有内容,或 sed 删除单词“total”。要枚举该目录中的文件,请在 shell 中使用通配符。
du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'
Run Code Online (Sandbox Code Playgroud)
如果您还需要遍历子目录中的文件,请使用find,或者使用**/模式(如果您的外壳支持)。对于**/,在 bash 中,首先运行shopt -s extglob,并注意 bash 版本高达 4.2 将遍历目录的符号链接;在 zsh 中,这是开箱即用的。
du -sc /var/foo/**/*.pdf | tail -n1
Run Code Online (Sandbox Code Playgroud)
find 版本的另一个复杂之处是,如果文件太多,find将运行du多次,以保持在命令行长度限制之下。使用通配符方法时,如果发生这种情况,您将收到错误消息(“超出命令行长度限制”)。以下代码假定您没有任何包含换行符的匹配文件名。
find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Run Code Online (Sandbox Code Playgroud)