You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:42:01