Linux按子文件夹大小、文件修改时间删文件且排除指定目录实现方法
正确实现方案
核心误区说明
你之前用find的-size -5k判断目录大小的逻辑是错误的:该参数统计的是目录inode本身的元数据大小,不是目录下所有文件的总大小,所以第一步筛选就不符合需求。
单行快速实现
find ./main -maxdepth 1 -type d ! -name "second" -exec sh -c 'for d; do [ $(du -sk "$d" | cut -f1) -lt 5 ] && find "$d" -type f -mmin +5 -delete; done' sh {} +
各部分逻辑说明:
find ./main -maxdepth 1 -type d ! -name "second":仅遍历./main下的一级子目录,排除second目录du -sk "$d" | cut -f1:统计目标目录的总大小,单位为KB- 匹配总大小小于5KB的目录后,执行第二层
find删除该目录下修改时间超过5分钟的普通文件
易维护脚本实现
如果需要后续调整规则,推荐写成独立脚本:
#!/usr/bin/env bash # 遍历main目录下的所有一级子目录 for dir in ./main/*/; do # 跳过second目录 [[ "$dir" == *"/second/" ]] && continue # 统计目录总大小(单位KB,向上取整) dir_size=$(du -sk "$dir" | awk '{print $1}') # 总大小小于5KB时执行清理 if (( dir_size < 5 )); then # 测试时可先替换-delete为-print,确认删除列表符合预期后再替换回-delete find "$dir" -type f -mmin +5 -delete fi done
精度调整说明
如果需要精确到字节判断5KB(即5120字节),可以把du -sk替换为du -sb,同时将判断条件改为(( dir_size < 5124 ))即可。
内容的提问来源于stack exchange,提问作者Scholar
相关产品推荐
相关产品推荐

