Linux文件大小统计命令与实用脚本大全 1. Linux文件大小统计需求解析在Linux系统管理中文件大小统计是最基础却最频繁的需求之一。想象你正在清理服务器磁盘空间或者需要统计某个项目目录的总体积亦或是准备备份前要估算容量——这些场景都要求我们快速准确地获取文件集合的总大小。与Windows系统不同Linux需要通过命令行工具来完成这类操作这恰恰体现了Linux高效灵活的特性。我管理过的服务器中曾遇到一个典型案例某Web应用的日志目录因未设置轮转策略3个月内膨胀到占满80%磁盘空间。当时就是用文件统计命令快速定位了问题文件。这种实用技能无论是系统管理员、开发人员还是数据分析师都值得掌握。2. 核心命令工具对比2.1 du命令深度剖析dudisk usage是专门为磁盘使用统计设计的工具。基础用法很简单du -sh /path/to/directory这里的参数组合-s表示只显示总计summary-h以人类可读格式显示KB/MB/GB但实际工作中我们常需要更精确的控制。比如统计当前目录下所有.jpg文件的总大小du -ch *.jpg | grep total-c参数会在最后生成总计行配合grep过滤出我们需要的结果。这个命令的底层原理是遍历文件系统的inode信息获取块分配情况因此对符号链接需要特别处理——默认会统计链接指向的文件大小添加-L参数可强制跟踪符号链接。注意在包含大量文件的目录中使用*通配符可能导致参数列表过长错误。此时应改用find配合xargsfind . -name *.jpg -print0 | xargs -0 du -ch | grep total2.2 ls与awk的组合技虽然ls本身不是为统计设计的但配合awk可以实现灵活的大小统计ls -l *.log | awk {sum $5} END {print sum}这个命令链的工作原理ls -l以长格式列出文件详情第5列为字节大小awk逐行读取累加第5列数值END块输出最终总和我更喜欢用ruby实现更美观的输出ls -l *.log | ruby -e puts Total: %.2fMB % (readlines.map{|l| l.split[4].to_f}.inject(:)/1024/1024)这种方法适合需要复杂处理的场景比如同时统计文件数量和平均大小。2.3 find命令的统计潜力find本身不直接提供统计功能但结合其他工具异常强大。例如统计30天前创建的日志文件总大小find /var/log -name *.log -mtime 30 -exec du -ch {} | grep total关键参数-mtime 30修改时间超过30天的文件-exec ... 高效批量处理找到的文件在百万级文件系统中这个方案比单纯用du更高效因为find可以先用索引筛选文件。3. 生产环境实用脚本3.1 多目录对比统计脚本这是我日常使用的目录对比脚本保存为compare_dirs.sh#!/bin/bash # 用法./compare_dirs.sh dir1 dir2 [file_pattern] pattern${3:-*} # 默认匹配所有文件 echo 磁盘使用对比 printf %-30s %-15s %-15s\n 目录 大小 文件数 for dir in $1 $2; do size$(find $dir -name $pattern -exec du -ch {} | grep total | cut -f1) count$(find $dir -name $pattern | wc -l) printf %-30s %-15s %-15s\n $dir $size $count done使用示例./compare_dirs.sh /var/log/nginx /var/log/apache2 *.log输出会显示两个目录下日志文件的大小和数量对比非常适合容量预警和清理决策。3.2 按扩展名分类统计这个脚本可以分析目录中各类文件的空间占用分布#!/bin/bash # 用法./stats_by_ext.sh /path/to/dir find $1 -type f | grep -E *\.[a-zA-Z0-9]$ | sed s/.*\.// | sort | uniq -c | while read count ext; do size$(find $1 -name *.$ext -exec du -cb {} | grep total | cut -f1) printf %-10s %-6s files %-15s\n .$ext $count $(numfmt --toiec $size) done输出示例.log 142 files 1.4G .jpg 85 files 346M .zip 12 files 2.1G4. 性能优化与陷阱规避4.1 百万级文件的处理技巧当处理包含数十万文件的目录时直接使用du *会导致argument list too long错误。此时应该使用find的-exec 而非-exec \;减少进程创建开销添加-print0和xargs -0处理含特殊字符的文件名对远程文件系统添加-D参数使用dirent缓存优化后的命令find /data -type f -print0 | xargs -0 du -ch | grep total4.2 常见问题排查问题1统计结果与df显示不一致这是因为du统计文件实际大小df统计块分配情况存在已删除但被进程占用的文件lsof检查问题2统计包含挂载点使用-x参数限制在同一文件系统du -xsh /path问题3容器内统计不准确在Docker容器中建议直接挂载/proc/1/rootdu -sh /proc/1/root/path/to/volume5. 可视化与进阶技巧5.1 生成树状大小图安装ncdu工具sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # RHEL/CentOS使用示例ncdu /var/log这个交互式工具可以按大小排序文件和目录导航浏览文件树直接删除不需要的文件5.2 实时监控目录变化使用watch命令持续观察目录大小变化watch -n 60 du -sh /tmp结合inotify-tools可以实现更精细的事件监控inotifywait -m -r --format %w%f /path | while read file; do size$(du -sh $file | cut -f1) echo $(date) - $file changed, size: $size done5.3 文件大小阈值告警将以下脚本加入cron定时任务#!/bin/bash THRESHOLD10G DIR/data usage$(du -sb $DIR | cut -f1) if [ $usage -gt $(numfmt --fromiec $THRESHOLD) ]; then echo 警报$DIR 使用量超过 $THRESHOLD | mail -s 磁盘警报 adminexample.com fi6. 扩展应用场景6.1 备份容量预估在实施备份前精确计算需要备份的数据量rsync -n -av --stats /source /backup | grep Total transferred file size-n参数模拟运行而不实际传输配合--stats获取准确的预估大小。6.2 配额监控对用户目录实施配额监控for user in /home/*; do echo -n ${user##*/}: du -sh $user done | sort -h6.3 日志轮转决策分析日志文件增长趋势# 按周统计日志增长 for i in {0..12}; do date$(date -d $i weeks ago %Y-%m-%d) size$(find /var/log -name *.log -mtime $((i*71)) -mtime $((i*7)) -exec du -ch {} | grep total | cut -f1) echo $date,$size done这个命令会输出过去12周每周的日志增量帮助确定合理的轮转周期。