用xargs配合du统计分散文件总体物理体积,需用du -b输出字节再awk累加,避免-du -sh带单位导致计算错误,物理体积指磁盘实际占用而非逻辑大小。

用 xargs 配合 du 统计一组分散文件的总体物理体积,关键是让 du 对每个文件单独计算(避免目录递归),再用 --summarize(即 -s)汇总,最后用 -h 可读化输出。核心命令结构是:
基础组合:逐个统计 + 汇总
假设你有一组文件路径(比如通过 find、grep 或手动列出),想算它们占的总磁盘空间(按实际占用的块大小,即物理体积):
- 确保只传文件(非目录),因为
du默认对目录会递归统计子内容;若混入目录,需加-L(跟随符号链接)或明确过滤 - 用
du -b或du -k控制单位(-b= bytes,-k= KiB),但更推荐du -sh配合-s单次汇总 - 正确写法示例(以文件列表为例):
cat filelist.txt | xargs -d '\n' du -sh | awk '{sum += $1} END {print sum "K"}'—— ❌ 错误!$1是带单位的字符串(如12M),不能直接相加
推荐做法:用 --apparent-size 或 -b 避免单位干扰
要准确求和,最稳妥的是让 du 输出纯数字(字节),再用 awk 累加:
-
cat filelist.txt | xargs -d '\n' du -b | awk '{sum += $1} END {print sum}'→ 输出总字节数 - 如果想带单位显示,后续可换算:
... | awk '{sum += $1} END {printf "%.2f MB\n", sum/1024/1024}' -
xargs -d '\n'适用于含空格的路径;若路径无特殊字符,可简写为xargs du -b
常见快捷场景举例
▶ 统计当前目录下所有 .log 文件总大小:find . -name "*.log" -type f -print0 | xargs -0 du -b | awk '{sum += $1} END {print sum " bytes"}
▶ 统计 git 未跟踪但已存在的大文件(如构建产物):git ls-files --others --exclude-standard | xargs -r du -b | awk '{sum += $1} END {if(sum) print sum}'(-r 防止空输入报错)
注意物理体积 ≠ 逻辑大小
du 默认统计的是磁盘实际占用(考虑文件系统块大小、稀疏文件等),这正是“物理体积”的含义。如果你需要逻辑大小(即文件 stat 中的 st_size),应加 --apparent-size 参数:xargs du -b --apparent-size 或 xargs du -sh --apparent-size(但后者仍无法直接求和,需转纯数字)

















