如何在Linux中递归地计算特定文件的总大小?

11

我有许多文件分散在不同的文件夹中,布局如下:

dir1/somefile.gif
dir1/another.mp4
dir2/video/filename.mp4
dir2/some.file
dir2/blahblah.mp4

我需要找到仅限于MP4文件的总磁盘空间使用情况。这意味着必须以某种递归方式进行。

我已经查看了du以及尝试通过将一些内容传输到grep来调整,但似乎无法计算出只有MP4文件的空间使用情况。

最好以GB为单位提供人类可读的总磁盘空间输出吗?

有任何想法吗?谢谢


注意:原文中的“only”表示只有MP4文件,需在翻译中表达出来,并不是“唯一”的意思。
3个回答

10

对于单个文件的大小:

find . -name "*.mp4" -print0 | du -sh --files0-from=- 

总磁盘空间(以GB为单位):

find . -name "*.mp4" -print0 | du -sb --files0-from=-  | awk '{ total += $1} END { print total/1024/1024/1024 }'

我也正要建议使用第一个命令。由于您传递了 -s 参数,它应该已经进行了汇总,但是如果传递了 --files0-from 参数,它会列出每个单独文件的大小。这看起来像是一个 bug,不是吗? - hek2mgl
1
从 man 页面:-s,仅为每个参数显示总数。这里通过标准输入传递的每个文件都是不同的参数。-s 在处理目录时非常有用。 - Marco Guerri
1
它计算当前目录的总数,完全忽略“find”输出。这不是被要求的内容。 - Marco Guerri
1
该死,你是对的.. du默认情况下忽略stdin。谢谢你的指出。 - hek2mgl
1
注意:--files0-from 是GNU特有的,所以例如在OS X或BSD上你没有它... - clt60
显示剩余3条评论

4
你可以简单地执行以下操作:
find -name "*.mp4" -exec du -b {} \; | awk 'BEGIN{total=0}{total=total+$1}END{print total}'

find命令的-exec选项会将{}替换为find找到的文件,并执行简单的命令。 du -b会以字节为单位显示文件的大小。 awk命令会将变量初始化为0,并获取每个文件的大小,最后显示总大小。


4
这将对所有 mp4 文件的大小进行字节级求和:
find ./ -name "*.mp4" -printf "%s\n" | paste -sd+ | bc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接