如何编写Bash脚本批量重命名目录中符合规则的文件
解决方案
方法一:通用Bash循环(兼容所有Linux发行版)
创建脚本文件rename_chapters.sh,内容如下:
#!/bin/bash # 遍历当前目录下所有mp3文件 for file in *.mp3; do # 跳过非文件类型(比如目录) [ -f "$file" ] || continue # 第一步:删除"chapter_"之前的所有内容 cleaned_file="${file#*chapter_}" cleaned_file="chapter_$cleaned_file" # 第二步:给单个数字章节号添加前导零 final_file=$(echo "$cleaned_file" | sed -E 's/chapter_([0-9])_/chapter_0\1_/') # 仅当文件名有变化时执行重命名,避免重复操作 if [ "$file" != "$final_file" ]; then mv -v "$file" "$final_file" fi done
使用步骤:
- 将脚本放在音频文件所在目录
- 赋予执行权限:
chmod +x rename_chapters.sh - 运行脚本:
./rename_chapters.sh
方法二:Perl版rename命令(快速一行完成)
适用于Debian/Ubuntu这类默认搭载Perl版rename的系统:
# 先预览重命名结果(仅测试,不实际修改文件) rename -n 's/.*?(chapter_)/$1/; s/chapter_([0-9])_/chapter_0$1_/' *.mp3 # 确认结果正确后,去掉-n执行实际重命名 rename 's/.*?(chapter_)/$1/; s/chapter_([0-9])_/chapter_0$1_/' *.mp3
正则逻辑说明
s/.*?(chapter_)/$1/:非贪婪匹配chapter_之前的所有内容,替换为chapter_,实现前缀删除s/chapter_([0-9])_/chapter_0$1_/:匹配chapter_后跟单个数字的场景,替换为chapter_0加该数字,补全前导零
注意事项
- CentOS/RedHat等系统默认是util-linux版
rename,语法不兼容,建议用方法一 - 操作前建议备份文件,避免意外错误
- 脚本已处理带空格的文件名,所有变量均用双引号包裹
内容的提问来源于stack exchange,提问作者user20858832
相关产品推荐
相关产品推荐

