Answers:
find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
如果du
由于文件列表很长而需要多次调用,那么将报告多个总计,并且需要对其进行汇总。
LC_ALL=POSIX
像这样在总grep中添加前缀,例如:LC_ALL=POSIX find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
-name
,则将grep更改为,grep -P "\ttotal$"
否则它将捕获所有以“ total”结尾的文件。
bc
,因此这里是一种更可移植的解决方案:find -name '*.jpg' -type f -exec du -bc {} + | grep total$ | cut -f1 | awk '{ total += $1 }; END { print total }'
du -ch public_html/images/*.jpg | grep total
20M total
给我.jpg
该目录中文件的总使用量。
要处理多个目录,您可能必须以find
某种方式将其组合。
您可能会发现du命令示例很有用(还包括find
)
find
可能会返回错误的结果。
du -ch -- ./{dir1,dir2}/*.jpg
或du -ch -- ./{prefix1*,prefix2*}.jpg
Argument list too long
处理大约300k文本文件时出现错误。
getconf ARG_MAX
。如果您有更多文件,则需要使用for循环逐个或逐批处理文件。
最终答案是:
{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc
甚至更快的版本,不受RAM的限制,但这需要具有bignum支持的GNU AWK:
find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'
此版本具有以下功能:
find
指定所需文件的所有功能find
对文件名进行简单的通配符匹配5.5K
,176.7M
,...)
| numfmt --to=si
到现在为止给出的答案都没有考虑到从find到du传递的文件列表可能很长,以至于find会自动将列表拆分成多个块,从而导致多次出现total
。
您可以grep total
手动(locale!)进行总结,也可以使用其他命令。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 ...)并输出(以Null结尾)。
xargs -r0 du -a
:-r:即使没有传递任何参数,Xargs也会调用该命令,这-r可以防止。-0表示以null终止的字符串(不以换行符终止)。
awk '{sum+=$1} END {print sum}'
:总结上一条命令输出的文件大小
作为参考,另一种方式是
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-
du --file0-from
花了更长的时间,因为您先运行了它(缓存效果)。
xargs
,du -a
可能会运行多个,因此,如果存在硬链接,则可能会有差异。
如果文件列表太大而不能传递给du -c
GNU系统上的单个调用,则可以执行以下操作:
find . -iname '*.jpg' -type f -printf '%b\t%D:%i\n' |
sort -u | cut -f1 | paste -sd+ - | bc
(大小以512字节块的数量表示)。像du
它只计算一次硬链接。如果您不关心硬链接,则可以将其简化为:
(printf 0; find . -iname '*.jpg' -type f -printf +%b) | bc
如果要使用大小而不是磁盘使用量,请替换%b
为%s
。大小将以字节表示。
-bash: bc: command not found
Centos-Linux 2.6.32-431.el6.x86_64
bc
是非可选的POSIX命令。
到目前为止提到的解决方案效率低下(exec成本很高),并且如果文件列表很长或者它们不能在Mac OS X上运行,则需要进行额外的手动工作才能总结。以下解决方案非常快,可以在任何系统上使用,并且产生以GB为单位的总答案(如果要以MB为单位,则删除/ 1024):
find . -iname "*.jpg" -ls |perl -lane '$t += $F[6]; print $t/1024/1024/1024 . " GB"'
-iname
也不-ls
是便携式的,因此它也不能在任何系统上运行。如果有包含换行符的文件名或符号链接目标,它也将无法正常工作。