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

Bash实现测试结果目录计数器命名,留存最近5个目录

Hey,我刚好做过类似的测试结果留存需求,给你一套完整的实现方案,不管是逻辑梳理还是可直接运行的脚本都给你理清楚:

完整实现方案:保留最近5个测试结果目录

核心逻辑梳理

先明确我们要实现的核心规则:

  • 每次测试完成后生成的target目录,要作为**最新的结果(target1)**留存
  • 旧的结果目录依次往后编号(target1→target2,target2→target3…)
  • 当已有5个结果目录时,先删除最旧的那个(target5),再将剩余的4个目录依次后移编号,最后把新的target命名为target1

可直接运行的Bash脚本

这个脚本可以直接集成到你的测试执行流程末尾,自动完成目录重命名、旧目录清理的操作:

#!/bin/bash

# 定义要保留的最大测试结果目录数
MAX_TARGETS=5

# 第一步:检查新生成的target目录是否存在
if [ ! -d "target" ]; then
    echo "❌ Error: 测试生成的target目录不存在,终止操作!"
    exit 1
fi

# 第二步:收集已存在的target*目录,提取编号并按从大到小排序
# (从大到小排序是为了避免重命名时覆盖目录)
existing_targets=$(ls -d target* 2>/dev/null | grep -E 'target[0-9]+' | sed 's/target//' | sort -nr)

# 第三步:如果目录数量已达上限,先删除最旧的目录(编号最大的那个)
if [ $(echo "$existing_targets" | wc -l) -eq $MAX_TARGETS ]; then
    oldest_target_num=$(echo "$existing_targets" | head -n1)
    oldest_target="target$oldest_target_num"
    echo "🗑️  已达留存上限,删除最旧的结果目录:$oldest_target"
    rm -rf "$oldest_target"
    # 删除后重新收集剩余的目录编号
    existing_targets=$(ls -d target* 2>/dev/null | grep -E 'target[0-9]+' | sed 's/target//' | sort -nr)
fi

# 第四步:将现有目录依次往后编号(targetN → targetN+1)
for num in $existing_targets; do
    new_num=$((num + 1))
    mv "target$num" "target$new_num"
    echo "🔄  重命名目录:target$num → target$new_num"
done

# 第五步:把新生成的target目录命名为最新的target1
mv target target1
echo "✅  新测试结果已命名为:target1"

关键细节说明

  • 编号顺序处理:脚本从最大的编号开始重命名,比如先把target4改成target5,再改target3→target4,这样能避免小编号目录被提前覆盖的问题
  • 容错检查:开头先检查target目录是否存在,避免测试失败后执行无效操作
  • 可配置性:通过MAX_TARGETS变量可以随时调整要留存的目录数量,不用改核心逻辑

注意事项

  • 确保脚本有足够的权限执行rm -rf和mv操作,可通过chmod +x script.sh给脚本加执行权限
  • 建议先在测试环境模拟运行:把脚本里的rm -rf改成echo rm -rf、mv改成echo mv,确认逻辑符合预期后再正式使用
  • 如果你的测试目录可能为空,可以在开头增加非空检查:[ -d "target" ] && [ "$(ls -A target)" ]

内容的提问来源于stack exchange,提问作者Diego S. Delgado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:12:13