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

Linux Bash脚本重复执行时避免文件重命名重复问题

修复重复执行导致文件名重复的重命名脚本

问题根源

原脚本的判断条件仅检查文件名不含后缀的部分是否包含_${ii},而非精确匹配以_${ii}结尾,导致两种问题:

  • 若原始文件名本身包含_${ii}(如abc_001def.txt),会被误判为已符合格式而跳过重命名
  • 重复执行时,已重命名的文件(如abc_001.txt)若被错误触发重命名,会被再次添加后缀,变成abc_001_001.txt

修改后的脚本

#!/bin/bash
for ((ii=1; ii<=100; ii++))
do
    dirnum=$(printf "%03d" "$ii")
    dirname="data${dirnum}"
    
    # 跳过不存在的目录,避免报错
    [[ ! -d "$dirname" ]] && continue

    for file in "$dirname"/*
    do
        # 跳过子目录,只处理文件
        [[ -d "$file" ]] && continue
        
        filename=$(basename "$file")
        extension="${filename##*.}"
        filename_without_ext="${filename%.*}"

        # 精确匹配:文件名不含后缀部分是否以 "_${dirnum}" 结尾
        if [[ "$filename_without_ext" =~ _${dirnum}$ ]]; then
            continue
        fi

        # 提取原始文件名主体:移除末尾所有多余的 "_xxx"(三位数字后缀)
        original_name=$(echo "$filename_without_ext" | sed -E 's/_[0-9]{3}$//')
        # 生成符合要求的新文件名
        newname="${original_name}_${dirnum}.${extension}"
        
        mv "$file" "${dirname}/${newname}"
    done
done

关键修改说明

  1. 精确格式校验:使用正则表达式=~ _${dirnum}$,仅当文件名不含后缀的部分以_NNN结尾时才判定为符合格式,避免误判原始文件名包含_NNN的情况
  2. 修复错误命名:通过sed命令移除文件名末尾多余的_xxx三位数字后缀,确保即使文件被重复重命名过,也能恢复到正确的格式
  3. 鲁棒性优化:增加了目录存在性检查和子目录跳过逻辑,避免脚本因目录不存在或包含子目录而报错
  4. 变量拆分:将目录数字单独存为dirnum,提升代码可读性

效果验证

  • 首次执行:data001目录下的abc.txt → abc_001.txt
  • 重复执行:检测到abc_001以_001结尾,直接跳过,不会修改
  • 错误修复:若文件被误命名为abc_001_001.txt,执行脚本后会修正为abc_001.txt

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:23:10