接受的答案有几个潜在的问题:
- 它不会进入子目录(不依赖非标准的 shell 功能,例如
globstar
)
- 一般来说,正如下面丹尼斯威廉姆森所指出的,您应该避免解析
ls
- 即,如果用户或组(第 3 列和第 4 列)中有空格,则第 5 列将不是文件大小
- 如果你有一百万个这样的文件,这将产生两百万个子shell,它会很慢
正如ghostdog74 所建议的,您可以使用 GNU 特定的-printf
选项来find
实现更强大的解决方案,避免所有过多的管道、子外壳、Perl 和奇怪的du
选项:
# the '%s' format string means "the file's size"
find . -name "*.txt" -printf "%s\n" \
| awk '{sum += $1} END{print sum " bytes"}'
是的,是的,使用paste
or的解决方案bc
也是可能的,但不再那么简单了。
在 macOS 上,您需要使用 Homebrew 或 MacPorts 来安装findutils
,然后调用gfind
。(我在这个问题上看到了“linux”标签,但它也被标记为“unix”。)
如果没有 GNU find
,您仍然可以回退到使用du
:
find . -name "*.txt" -exec du -k {} + \
| awk '{kbytes+=$1} END{print kbytes " Kbytes"}'
…但是您必须注意,由于历史原因,du
默认输出为512 字节块(请参阅手册页的“RATIONALE”部分),并且某些版本du
(尤其是 macOS)甚至没有以字节为单位打印大小的选项。
这里有许多其他很好的解决方案(特别是参见Barn 的答案),但大多数都存在不必要的复杂性或过于依赖 GNU-only 功能的缺点——也许在您的环境中,没关系!