我在目录中有数百个pdf文件和html文件。我想知道pdf文件的总大小。
通过命令,du -ch /var/foo
我可以看到文件的总大小,但是我只需要最后一行,即总大小。
如果目录仅包含pdf文件,我可以使用-s
选项,但是这次不能使用该选项。
如何仅获取特定文件类型的总大小?
du -ch /var/foo/*.pdf | tail -n 1
我在目录中有数百个pdf文件和html文件。我想知道pdf文件的总大小。
通过命令,du -ch /var/foo
我可以看到文件的总大小,但是我只需要最后一行,即总大小。
如果目录仅包含pdf文件,我可以使用-s
选项,但是这次不能使用该选项。
如何仅获取特定文件类型的总大小?
du -ch /var/foo/*.pdf | tail -n 1
Answers:
使用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
本身将被计入)
您可以让外壳扩展文件:
$ 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
显示每个文件的磁盘使用情况(在大多数文件系统上,文件大小四舍五入为块大小的下一个倍数)。使用选项-b
,du
显示每个文件的大小。
du -sh /foo/*.pdf
吗?