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
相关产品推荐
相关产品推荐

