Linux批量重命名文件有五种常用方法:一、rename命令结合正则表达式;二、for循环配合mv实现可控重命名;三、mmv命令进行模式化重命名;四、find配合-exec递归处理多级目录;五、Shell参数扩展实现无依赖轻量操作。

如果您需要在Linux系统中批量重命名多个文件,但手动逐个修改效率低下且容易出错,则可以利用rename命令结合通配符实现高效、精准的批量操作。以下是几种常用且互不依赖的批量修改文件名方法:
一、使用rename命令配合基本正则替换
rename命令支持Perl风格正则表达式,可对文件名中匹配的字符串进行全局替换,适用于统一前缀、后缀或中间字符的批量修改。
1、将当前目录下所有以“.txt”结尾的文件改为“.log”结尾:
rename 's/\.txt$/.log/' *.txt
2、删除所有文件名开头的“old_”前缀:
rename 's/^old_//' old_*
3、将文件名中的空格全部替换为下划线:
rename 's/ /_/g' *
二、使用for循环配合mv命令实现可控重命名
当rename不可用或需加入条件判断、格式化逻辑时,for循环提供更高自由度,尤其适合处理数字序号、日期格式等结构化重命名场景。
1、将当前目录所有.jpg文件按顺序重命名为img001.jpg、img002.jpg……:
counter=1; for file in *.jpg; do mv "$file" "img$(printf "%03d" $counter).jpg"; ((counter++)); done
2、为每个文件名前添加时间戳前缀(如20240520_):
for file in *; do mv "$file" "20240520_$file"; done
3、仅对大小超过1MB的文件重命名,添加“.large”后缀:
for file in *; do [[ -f "$file" ]] && [[ $(stat -c "%s" "$file") -gt 1048576 ]] && mv "$file" "${file}.large"; done
三、使用mmv命令进行模式化批量重命名
mmv命令专为批量移动与重命名设计,通过通配符模式匹配源文件与目标名称,语法简洁且支持反向引用,适合复杂映射关系。
1、安装mmv(如未预装):
sudo apt install mmv (Debian/Ubuntu)
sudo yum install mmv (CentOS/RHEL)
2、将所有“file_*.txt”重命名为“document_*.txt”:
mmv "file_*.txt" "document_#1.txt"
3、交换文件名中两个下划线分隔字段的位置(如abc_def_ghi.txt → def_abc_ghi.txt):
mmv "*_*_*.txt" "#2_#1_#3.txt"
四、使用find配合-exec执行多级目录重命名
当需递归处理子目录中符合条件的文件时,find命令可精准定位路径,再调用rename或mv完成重命名,避免遗漏深层文件。
1、递归查找并重命名所有名为“temp.log”的文件为“backup.log”:
find . -type f -name "temp.log" -exec rename 's/temp\.log$/backup.log/' {} \;
2、将所有层级下的“.bak”文件移至同级目录并改名为“.old”:
find . -type f -name "*.bak" -exec mv {} {}old \; -exec rename 's/\.bakold$/.old/' {}old \;
3、仅对最近7天内修改过的PNG文件添加“recent_”前缀:
find . -type f -name "*.png" -mtime -7 -exec rename 's/^/recent_/' {} \;
五、使用shell参数扩展进行无外部命令的轻量重命名
纯Bash内置功能即可完成简单批量操作,无需依赖rename、mmv等额外工具,适用于受限环境或脚本嵌入场景。
1、去除所有文件名末尾的“.tmp”扩展名:
for file in *.tmp; do [[ -e "$file" ]] && mv "$file" "${file%.tmp}"; done
2、将所有文件名转为小写(兼容含空格路径):
for file in *; do [[ -e "$file" ]] && mv "$file" "$(echo "$file" | tr 'A-Z' 'a-z')"; done
3、在所有文件名后追加“.processed”后缀:
for file in *; do [[ -e "$file" ]] && mv "$file" "${file}.processed"; done










