如何在bash中统计指定日期对应文件夹的磁盘占用量
Bash环境下统计特定日期文件夹总占用空间方案
通用方案(按文件夹修改时间查询)
适合绝大多数场景,命令如下:
find /your/target/root/path -type d -newermt "2024-05-20 00:00:00" ! -newermt "2024-05-20 23:59:59" -print0 | du -ch --files0-from=- | tail -n 1
参数说明:
/your/target/root/path替换为你要扫描的根目录路径-type d限定只扫描文件夹,排除普通文件-newermt "时间"匹配修改时间晚于指定时间的文件夹,搭配!取反后,两个参数组合即可锁定对应日期的时间范围,按需替换成你要查询的日期即可-print0与du的--files0-from=-配对使用,兼容带空格、特殊字符的文件夹名,避免统计异常du -ch统计大小,-c输出总和、-h返回人类可读的单位(G/M/K),需要精确字节数的话把-h换成-b即可tail -n 1只输出最终总大小,不需要看每个文件夹的单独大小可保留,去掉则会打印所有匹配到的文件夹的大小
按文件夹创建时间查询
如果需要匹配文件夹的创建时间而非修改时间,只要你的文件系统支持birth time(ext4、xfs、btrfs等主流文件系统均支持,GNU find 4.3.3以上版本可用),把命令中的-newermt替换为-newerBt即可:
find /your/target/root/path -type d -newerBt "2024-05-20 00:00:00" ! -newerBt "2024-05-20 23:59:59" -print0 | du -ch --files0-from=- | tail -n 1
海量文件夹场景性能优化
- 仅需要统计根目录下第一层级的文件夹时,给find添加
-maxdepth 1参数,可避免递归扫描子目录,性能提升非常明显 - 不要使用
find | xargs du的写法,文件夹数量过万时容易出现参数过长报错,本方案用的--files0-from直接从标准输入读入路径,内存占用更低、稳定性更好 - 高频查询的场景可配置cron定时任务,每天凌晨自动统计前一天的大小写入日志,避免每次查询全量扫描
注意事项
- du默认统计的是磁盘实际块占用,会自动对硬链接去重,符合实际磁盘占用的统计需求;如果需要统计文件夹内容的实际大小(不含块对齐浪费的空间),给du添加
--apparent-size参数即可
内容的提问来源于stack exchange,提问作者Rainer
相关产品推荐
相关产品推荐

