Bash脚本批量重命名子目录文件 适配Mystic BBS文件名规则
适配Mystic BBS平台的批量文件重命名解决方案
最终实现脚本
满足所有重命名规则,支持递归遍历子目录、清理非法字符、长度自动截断:
#!/bin/bash # 配置项:默认处理当前目录,也可执行时传入指定目录 TARGET_DIR="${1:-.}" # 配置项:最大允许文件名长度 MAX_FILENAME_LEN=79 # 递归遍历所有文件,兼容带空格/特殊字符的文件名 find "${TARGET_DIR}" -type f -print0 | while IFS= read -r -d $'\0' full_path; do # 拆分文件路径、主名、扩展名 file_dir=$(dirname "${full_path}") full_name=$(basename "${full_path}") file_ext="${full_name##*.}" file_main="${full_name%.*}" # 1. 转写带抑扬符/波浪线的变体字母为普通ASCII,丢弃高位非法字符 cleaned_main=$(echo "${file_main}" | iconv -f UTF-8 -t ASCII//TRANSLIT//IGNORE) # 2. 所有非字母数字字符替换为下划线 cleaned_main=$(echo "${cleaned_main}" | sed -r 's/[^a-zA-Z0-9]/_/g') # 3. 合并连续下划线,去除首尾多余下划线 cleaned_main=$(echo "${cleaned_main}" | sed -r 's/_+/_/g; s/^_//; s/_$//') # 4. 长度截断,保留扩展名 if [[ "${file_ext}" != "${full_name}" ]]; then # 存在扩展名的情况,预留扩展名和分隔点的长度 allowed_main_len=$(( MAX_FILENAME_LEN - ${#file_ext} - 1 )) [[ ${allowed_main_len} -lt 1 ]] && allowed_main_len=1 cleaned_main="${cleaned_main:0:${allowed_main_len}}" final_name="${cleaned_main}.${file_ext}" else # 无扩展名直接截断 final_name="${cleaned_main:0:${MAX_FILENAME_LEN}}" fi # 执行重命名,-n参数避免覆盖同名文件 mv -n "${full_path}" "${file_dir}/${final_name}" done
使用说明
- 将脚本保存为
rename_bbs.sh,执行chmod +x rename_bbs.sh赋予执行权限 - 首次验证:把脚本中
mv -n前添加echo,执行脚本后会打印所有待执行的重命名操作,确认规则符合预期后再去掉echo正式执行 - 处理当前目录:
./rename_bbs.sh - 处理指定目录:
./rename_bbs.sh /path/to/your/archive/directory
原有问题修复说明
之前编写的命令存在的问题已全部解决:
- 修正了递归遍历的逻辑错误,使用
find -print0方案兼容所有特殊文件名格式,避免cd切换目录导致的路径错误 - 新增
iconv转换步骤自动处理变体字母和高位非法字符 - 新增连续下划线合并逻辑,避免多余字符占用长度
- 内置长度截断逻辑,自动保留扩展名不被截断
批量文件处理脚本学习路径推荐
- 基础层:熟练掌握
find、sed、awk、grep、iconv等常用文件/文本处理命令的核心参数,明确各命令的适用场景 - 语法层:掌握Bash字符串参数扩展、循环/分支结构、IFS变量控制、特殊变量的用法,学会正确处理带空格/特殊字符的文件名场景
- 安全层:养成批量操作前先模拟执行的习惯,学会备份原有文件名清单,掌握重名冲突的处理逻辑
- 优化层:了解
rename(Perl版)、mmv等专用批量重命名工具的用法,大批量文件处理时可使用并行工具提升执行效率
内容的提问来源于stack exchange,提问作者Paulie420
相关产品推荐
相关产品推荐

