mba*_*off 210 size directory directory-structure files
假设有一个图像存储目录,例如,./photos/john_doe,其中有多个子目录,许多特定文件驻留在其中(例如,*.jpg)。如何计算john_doe分支下这些文件的摘要大小?
我试过du -hs ./photos/john_doe/*/*.jpg,但这仅显示单个文件。此外,这仅跟踪john_doe目录的第一个嵌套级别,例如john_doe/june/,但会跳过john_doe/june/outrageous/。
那么,我如何遍历整个分支,总结某些文件的大小?
SHW*_*SHW 269
find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
Run Code Online (Sandbox Code Playgroud)
如果du由于文件列表很长而需要多次调用,则会报告多个总数并需要求和。
Lev*_*von 79
du -ch public_html/images/*.jpg | grep total
20M total
Run Code Online (Sandbox Code Playgroud)
给我.jpg这个目录中我的文件的总使用量。
要处理多个目录,您可能必须以find某种方式将其结合起来。
您可能会发现du 命令示例很有用(它还包括find)
Gil*_*il' 42
首先,您需要两件事:
du -ch -- **/*.jpg | tail -n 1
Run Code Online (Sandbox Code Playgroud)
rin*_*eal 37
最终答案是:
{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc
Run Code Online (Sandbox Code Playgroud)
甚至更快的版本,不受 RAM 限制,但这需要具有 bignum 支持的 GNU AWK:
find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'
Run Code Online (Sandbox Code Playgroud)
该版本具有以下特点:
find指定您要查找的文件的所有功能find做一个简单的文件名通配符匹配5.5K,176.7M,...)
| numfmt --to=siJan*_*Jan 13
到目前为止给出的答案没有考虑到从 find 传递给 du 的文件列表可能太长,以至于 find 自动将列表拆分为块,导致多次出现total.
您可以grep total(语言环境!)并手动总结,或使用不同的命令。AFAIK 只有两种方法可以获取 find 找到的所有文件的总计(以千字节为单位):
find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'
说明
find . -type f -iname '*.jpg' -print0:查找所有扩展名为 jpg 的文件,不分大小写(即 *.jpg、*.JPG、*.Jpg...)并输出它们(以空字符结尾)。
xargs -r0 du -a: -r: 即使没有传递参数,Xargs 也会调用命令,这是 -r 阻止的。-0 表示以空字符结尾的字符串(不以换行符结尾)。
awk '{sum+=$1} END {print sum}': 总结上一条命令输出的文件大小
作为参考,另一种方式是
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-