Bash批量重命名:将文件末尾增量数字转为三位格式
Bash批量重命名:将文件名末尾增量数字转为三位格式
核心思路
先拆分文件名的前缀部分、数字与前缀的分隔符(如果有)和末尾增量数字,把数字补零为三位后,再拼接成新文件名完成重命名。
方案一:结合sed的简洁实现
适合快速处理,依赖sed的正则匹配能力:
for file in *.pdf; do # 提取前缀(移除末尾的分隔符+数字+.pdf) prefix=$(echo "$file" | sed -E 's/(-|_)?[0-9]+\.pdf$//') # 提取末尾的数字部分 num=$(echo "$file" | sed -E 's/.*(-|_)?([0-9]+)\.pdf$/\2/') # 提取分隔符(-或_,没有则为空) separator=$(echo "$file" | sed -E 's/.*(-|_)?[0-9]+\.pdf$/\1/') # 将数字补为三位格式 new_num=$(printf "%03d" "$num") # 拼接新文件名 new_file="${prefix}${separator}${new_num}.pdf" # 预览重命名操作(确认无误后删除echo执行实际重命名) echo mv "$file" "$new_file" done
关键说明:
- 正则
(-|_)?[0-9]+\.pdf$匹配文件名末尾的「可选分隔符+数字+后缀」 - 先执行带
echo的命令,确认新文件名符合预期后,再去掉echo执行真实重命名
方案二:纯Bash内置实现(无外部命令)
适合处理大量文件,性能更优:
for file in *.pdf; do # 移除.pdf后缀 base=${file%.pdf} prefix="" num="" separator="" # 从后往前遍历字符,拆分前缀和数字 for ((i=${#base}-1; i>=0; i--)); do char=${base:i:1} if ! [[ $char =~ [0-9] ]]; then prefix=${base:0:i+1} num=${base:i+1} separator=$char # 若分隔符不是-/_,说明数字直接衔接前缀,清空分隔符 [[ $separator != "-" && $separator != "_" ]] && separator="" break fi done # 处理数字为文件名主体的情况(如123.pdf) [[ -z $prefix ]] && num=$base # 补零为三位 new_num=$(printf "%03d" "$num") new_file="${prefix}${separator}${new_num}.pdf" echo mv "$file" "$new_file" done
关键说明:
- 用Bash参数扩展
${file%.pdf}移除后缀,${base:i:1}截取单个字符 - 避免调用外部命令,减少进程开销,适合批量处理数百/数千个文件
注意事项
- 若目录中存在非目标格式的文件,可先过滤:
for file in $(ls *.pdf | grep -E '(-|_)?[0-9]+\.pdf$'); do # 执行上述重命名逻辑 done - 始终先通过
echo mv预览操作,防止误重命名重要文件
内容的提问来源于stack exchange,提问作者ppr
相关产品推荐
相关产品推荐

