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
关键修改说明
- 精确格式校验:使用正则表达式
=~ _${dirnum}$,仅当文件名不含后缀的部分以_NNN结尾时才判定为符合格式,避免误判原始文件名包含_NNN的情况 - 修复错误命名:通过
sed命令移除文件名末尾多余的_xxx三位数字后缀,确保即使文件被重复重命名过,也能恢复到正确的格式 - 鲁棒性优化:增加了目录存在性检查和子目录跳过逻辑,避免脚本因目录不存在或包含子目录而报错
- 变量拆分:将目录数字单独存为
dirnum,提升代码可读性
效果验证
- 首次执行:
data001目录下的abc.txt→abc_001.txt - 重复执行:检测到
abc_001以_001结尾,直接跳过,不会修改 - 错误修复:若文件被误命名为
abc_001_001.txt,执行脚本后会修正为abc_001.txt
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

