在Linux系统中,批量重命名文件是日常运维和开发中常见的操作,尤其在处理大量文件时,手动逐个修改效率极低,Linux提供了多种命令和工具支持批量重命名,可根据需求场景选择合适的方法,本文将详细介绍几种主流的批量重命名方式,包括命令行工具、脚本编程及第三方工具,并附具体示例和注意事项。

使用rename命令批量重命名(Perl版本)
rename是Linux中功能强大的批量重命名工具,基于Perl的正则表达式语法,支持复杂的模式匹配和替换,需要注意的是,系统默认可能安装的是C语言版本的rename(功能有限),建议安装Perl版本的rename(通常为prename或通过sudo apt install rename/sudo yum install prename安装)。
语法格式
rename 'Perl表达式' 文件名模式
Perl表达式通常使用s/旧模式/新模式/进行替换,文件名模式支持通配符(如*.txt、image_[0-9]*.jpg)。
示例
-
批量替换文件名中的固定字符
将当前目录下所有test_开头的文件名中的test_替换为demo_:rename 's/test_/demo_/' test_*
执行后,
test_1.txt→demo_1.txt,test_data.log→demo_data.log。 -
批量修改文件扩展名
将所有.txt文件改为.md:rename 's/.txt$/.md/' *.txt
表示字符串结尾,
.转义(正则表达式中是通配符)。 -
批量添加文件名前缀/后缀
为所有.jpg文件添加前缀photo_:rename 's/^/photo_/' *.jpg
^表示字符串开头。
为所有.log文件添加后缀_backup:rename 's/(.log)$/backup$1/' *.log
括号捕获分组,
$1引用分组内容,避免重复扩展名。 -
基于条件重命名(大小写转换等)
将所有文件名中的小写字母转为大写:rename 'tr/a-z/A-z/' *
tr是字符替换函数,a-z和A-z分别表示小写和大写字母范围。
注意事项
- 使用
-n参数可预览重命名结果,不实际执行:rename -n 's/old/new/' *。 - 正则表达式中的特殊字符(如、、)需转义,避免意外匹配。
- 操作前建议备份文件,避免误删或覆盖。
使用find+xargs/exec批量重命名
find命令用于按条件(如文件名、类型、修改时间)查找文件,结合xargs或-exec可实现对筛选文件的批量重命名,适合复杂条件下的重命名需求。
语法格式
find 查找路径 -type f -name "文件名模式" -exec mv {} 新文件名模式 ;
或结合xargs:

find 查找路径 -type f -name "文件名模式" | xargs -I {} mv {} 新文件名模式
-type f表示仅查找文件,-name指定文件名模式(支持通配符),-exec的代表查找到的文件,;结束命令;xargs的-I {}将输入的文件名替换为。
示例
-
递归修改子目录中文件的扩展名
将当前目录及其子目录下所有.csv文件改为.xlsx:find . -type f -name "*.csv" -exec mv {} {}.xlsx ;执行后,
data/2023.csv→data/2023.csv.xlsx(注意:此方法会保留原扩展名,需确保无冲突)。
更准确的写法(移除原扩展名):find . -type f -name "*.csv" | xargs -I {} bash -c 'mv "$1" "${1%.csv}.xlsx"' _ {}${1%.csv}是参数扩展,表示删除${1}中的.csv后缀。 -
按文件名中的数字序列重命名
将file_1.txt、file_2.txt…重命名为doc_001.txt、doc_002.txt…:find . -name "file_[0-9]*.txt" | sort -V | xargs -I {} bash -c ' num=$(echo "$1" | grep -o "[0-9]*") new_name=$(printf "doc_%03d.txt" $num) mv "$1" "$new_name" ' _ {}sort -V按数字版本排序,grep -o提取数字,printf格式化数字为3位补零(如1→001)。
注意事项
-exec的;必须转义,xargs的-I {}需明确替换符。- 复杂逻辑建议结合
bash -c执行,避免mv命令中的变量解析问题。 - 文件名中包含空格或特殊字符时,需用双引号包裹变量(如
"$1")。
使用Shell循环批量重命名
对于简单的批量重命名需求(如统一前缀、后缀或替换固定字符),Shell循环(for、while)更直观易用,无需额外安装工具。
示例
-
批量添加文件名前缀
为当前目录下所有.mp4文件添加video_前缀:for file in *.mp4; do mv "$file" "video_$file" done
双引号
"$file"避免文件名中的空格被拆分。 -
批量替换文件名中的空格为下划线
for file in *; do new_name="${file// /_}" [ "$file" != "$new_name" ] && mv "$file" "$new_name" done${file// /_}是Bash的参数扩展,全局替换所有空格为_,&&确保仅在文件名变化时执行mv。 -
批量重命名并编号
将image.jpg、image (1).jpg…重命名为photo_1.jpg、photo_2.jpg…:i=1 for file in image*.jpg; do mv "$file" "photo_$((i++)).jpg" done
$((i++))实现自增编号。
注意事项
- 循环中务必用双引号包裹文件名变量(如
"$file"),防止空格或通配符导致错误。 - 建议先使用
echo预览命令(如echo mv "$file" "$new_name"),确认无误后再执行mv。
使用mmv工具批量重命名(第三方工具)
mmv(mass move/rename)是一款轻量级批量重命名工具,支持模式匹配和模板替换,适合需要精确控制文件名格式的场景(需安装:sudo apt install mmv/sudo yum install mmv)。
语法格式
mmv 源模式 目标模式
源模式中表示通配符,目标模式中#1、#2等引用源模式中的分组。
示例
-
批量替换文件名中的字符
将data_2023.txt、data_2024.txt…改为report_2023.txt、report_2024.txt…:mmv 'data_*.txt' 'report_#1.txt'
#1引用data_和.txt之间的部分。 -
批量重命名并移动到子目录
将所有.log文件移动到logs目录并添加日期后缀:mmv '*.log' 'logs/#1_$(date +%Y%m%d).log'
$(date +%Y%m%d)是命令替换,插入当前日期。
注意事项
- 源模式中的是通配符,不同于正则表达式,匹配任意字符(除)。
- 目标模式中的
#n必须与源模式中的顺序对应,避免引用错误。
批量重命名方法对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
rename |
正则表达式替换、复杂模式匹配 | 功能强大,支持Perl正则 | 需安装Perl版本,学习成本稍高 |
find+xargs |
递归目录、按条件筛选后重命名 | 灵活,支持复杂查找条件 | 语法较复杂,需处理变量转义 |
| Shell循环 | 简单批量操作(前缀/后缀/替换) | 直观,无需额外工具 | 复杂逻辑需编写多行脚本 |
mmv |
精确模板匹配、批量移动+重命名 | 语法简洁,支持模板引用 | 需安装第三方工具 |
实用技巧
- 预览重命名结果:无论使用哪种方法,建议先通过
-n(如rename -n)或echo预览,避免误操作。 - 备份文件:批量重命名前,使用
cp -r 源目录 备份目录备份文件,防止数据丢失。 - 处理特殊字符:文件名中包含、、空格等特殊字符时,用双引号包裹,或通过
printf转义(如printf "%q" "$file")。
相关问答FAQs
Q1: 如何批量重命名包含空格的文件?
A: 文件名中的空格可能导致命令解析错误,需用双引号包裹变量,使用Shell循环批量替换空格为下划线:
for file in *; do
[ "$file" != "${file// /_}" ] && mv "$file" "${file// /_}"
done
或使用rename命令(需转义空格):
rename 's/ /_/g' * # 全局替换空格为下划线
Q2: 如何递归重命名子目录中的文件(如统一添加前缀)?
A: 结合find和while循环递归处理,为所有子目录中的.js文件添加module_前缀:
find . -type f -name "*.js" | while read -r file; do dir=$(dirname "$file") base=$(basename "$file") mv "$file" "$dir/module_$base" done
dirname提取文件所在目录,basename提取文件名,避免修改子目录结构。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/20967.html