Shell脚本如何统计休眠时段目录下被删除文件的总大小
解决方案
优先使用awk实现对比逻辑,相比循环遍历性能更高,尤其目录下文件数量较多时优势更明显。
注意:你当前使用
ls -l | awk 'NR>1 {print $5,$9}'生成快照的写法存在隐患,如果文件名包含空格、特殊字符,$9只会取到文件名第一个空格前的内容,会导致后续匹配失效。如果需要兼容特殊文件名,可以参考文末的优化方案。
方案1:awk单命令实现(推荐)
直接通过关联数组对比两次快照内容,无需额外循环,代码简洁高效:
# 追加在你获取完 FILES_CURRENT 变量之后即可 DELETED_TOTAL=$(awk ' # 读取初始快照,以文件名为key存储对应大小 NR == FNR { size_map[$2] = $1 next } # 读取当前快照,删除存在的文件记录,剩余的就是被删除的文件 { delete size_map[$2] } # 累加所有被删除文件的大小 END { total = 0 for (file in size_map) { total += size_map[file] # 不需要打印被删除文件详情可以删掉下面这行 print "已删除文件:" file " 大小:" size_map[file] "字节" } print total } ' <(echo "$FILES_SNAPSHOT") <(echo "$FILES_CURRENT")) echo "休眠期间被删除文件总大小:$DELETED_TOTAL 字节"
方案2:循环实现(适合小文件量场景,逻辑易懂)
如果偏好循环写法,逐行读取初始快照校验文件是否存在即可:
DELETED_TOTAL=0 # 逐行读取初始快照内容 while read -r file_size file_name; do # 校验当前快照是否存在该文件名 if ! echo "$FILES_CURRENT" | grep -q " ${file_name}$"; then echo "已删除文件:$file_name 大小:$file_size 字节" DELETED_TOTAL=$((DELETED_TOTAL + file_size)) fi done <<< "$FILES_SNAPSHOT" echo "休眠期间被删除文件总大小:$DELETED_TOTAL 字节"
兼容特殊文件名优化方案(可选)
如果需要支持带空格、特殊字符的文件名,将生成快照的逻辑替换为stat命令,用自定义分隔符避免空格干扰:
# 生成初始快照,用|作为大小和文件名的分隔符 FILES_SNAPSHOT="$(stat -c "%s|%n" *)" echo "Sleeping for $1 seconds..." sleep $1 # 生成当前快照 FILES_CURRENT="$(stat -c "%s|%n" *)"
对应调整awk的分隔符参数即可正常匹配:
DELETED_TOTAL=$(awk -F '|' ' NR == FNR { size_map[$2] = $1 next } { delete size_map[$2] } END { total = 0 for (f in size_map) total += size_map[f] print total } ' <(echo "$FILES_SNAPSHOT") <(echo "$FILES_CURRENT"))
内容的提问来源于stack exchange,提问作者Nathace
相关产品推荐
相关产品推荐

