在Linux系统中,重命名文件或目录是日常操作中非常常见的任务,虽然看似简单,但结合不同的命令和参数可以实现灵活高效的重命名需求,Linux下重命名操作主要通过mv
和rename
命令实现,其中mv
命令主要用于单文件或少量文件的重命名,而rename
命令(尤其是Perl版本的rename
)支持基于正则表达式的批量重命名,功能更强大,以下将详细介绍这两个命令的使用方法、参数说明及实际应用场景,并辅以示例帮助理解。

使用mv
命令重命名
mv
(move)命令的核心功能是移动文件或目录,但当源路径和目标路径位于同一目录时,其实际作用就是重命名,其基本语法为:mv [选项] 源文件 目标文件
,常用选项包括-i
(交互式,覆盖前提示)、-f
(强制覆盖,不提示)、-v
(显示详细操作过程)等。
单文件重命名
将file1.txt
重命名为file2.txt
,直接使用mv file1.txt file2.txt
即可,若目标文件已存在,加上-i
选项会提示是否覆盖,例如mv -i file1.txt existing_file.txt
,若文件存在,系统会询问mv: overwrite 'existing_file.txt'?
,输入y
确认覆盖。
批量重命名(结合通配符)
虽然mv
本身不支持复杂的批量重命名,但可通过通配符结合循环实现简单批量操作,将当前目录下所有.txt
文件扩展名改为.bak
,可使用for f in *.txt; do mv "$f" "${f%.txt}.bak"; done
,其中${f%.txt}
是参数扩展,表示去掉变量f
末尾的.txt
字符串,若需批量添加前缀,如给所有.jpg
文件添加new_
前缀,可用for f in *.jpg; do mv "$f" "new_$f"; done
。
目录重命名
重命名目录与文件操作一致,例如将old_dir
改为new_dir
,使用mv old_dir new_dir
,若目标目录已存在,且mv
命令会将源目录移动到目标目录内部(如mv dir1 dir2
,若dir2
存在,则dir1
成为dir2
的子目录),此时需注意避免误操作,建议加上-v
选项确认路径变化。

使用rename
命令批量重命名
rename
命令存在两个版本:基于C语言的rename
(简单正则)和基于Perl的rename
(功能强大),多数Linux发行版默认安装后者,可通过rename --version
或man rename
确认,以下以Perl版本为例,其语法为rename '表达式@' 文件列表
,表达式通常包含s/原模式/新模式/
(替换)和tr/字符集/字符集/
(字符转换)。
基于正则表达式的替换
将所有包含old
的文件名中的old
替换为new
,使用rename 's/old/new/' *
,将test_old_file.txt
改为test_new_file.txt
,执行rename 's/old/new/' test_old_file.txt
,若需全局替换(一行中所有匹配项),可在s
后加g
,如rename 's/test/Try/g' *
,将文件名中的所有test
改为Try
。
批量修改文件扩展名
将.txt
文件改为.md
,使用rename 's/\.txt$/.md/' *
,其中表示字符串末尾,\
用于转义(避免正则中的通配符含义),若需批量添加扩展名,如给无扩展名的文件添加.bak
,可用rename 's/$/.bak/' *
。
批量删除或添加字符
删除文件名中的所有数字:rename 's/\d+//g' *
;在文件名开头添加prefix_
:rename 's/^/prefix_/' *
;在文件名末尾添加_suffix
:rename 's/$/_suffix/' *
,将image1.jpg
改为image1_suffix.jpg
,执行rename 's/_suffix//' *
(反向操作)。

大小写转换
将所有文件名改为小写:rename 'y/A-Z/a-z/' *
;改为大写:rename 'y/a-z/A-Z/' *
,将TestFile.TXT
改为testfile.txt
,可组合使用rename 'y/A-Z/a-z/' *
和rename 's/\.txt$/.md/' *
(注意顺序)。
条件重命名
仅对匹配特定模式的文件重命名,如将test_
开头的文件中的test_
改为exam_
:rename 's/^test_/exam_/ if /^test_/' *
,Perl版本的rename
支持复杂的条件判断,可结合正则实现精细化控制。
mv
与rename
命令对比
特性 | mv 命令 |
rename 命令(Perl版) |
---|---|---|
适用场景 | 单文件、少量文件重命名 | 批量、复杂模式匹配重命名 |
语法复杂度 | 简单,直接指定源和目标 | 需编写正则表达式,有一定学习成本 |
批量操作能力 | 需结合脚本或循环实现 | 原生支持批量,一行命令完成 |
正则表达式支持 | 不支持 | 支持Perl兼容正则,功能强大 |
跨目录重命名 | 支持(移动文件) | 不支持(需结合find 命令) |
实际应用示例
示例1:批量整理图片文件
假设当前目录有图片文件IMG_20230101.jpg
、IMG_20230102.png
等,需重命名为20230101_IMG.jpg
格式,步骤如下:
- 提取日期并移动到文件名开头:
rename 's/^IMG_//; s/(\d{8})_/$1_/' *
- 统一扩展名为小写:
rename 'y/A-Z/a-z/' *
示例2:清理文件名中的空格和特殊字符
将My Document(1).txt
改为My_Document_1.txt
:
- 替换空格为下划线:
rename 's/ /_/g' *
- 去除括号:
rename 's/[()]//g' *
注意事项
- 备份重要文件:批量重命名前建议先备份,避免因正则错误导致文件名混乱。
- 测试正则表达式:复杂批量操作前,先用
rename -n '表达式' *
(-n
为模拟模式,不实际执行)检查结果。 - 避免覆盖:若目标文件可能存在,使用
mv -i
或rename
的-f
选项需谨慎。 - 命令版本差异:部分系统
rename
语法不同(如Ubuntu的rename
使用原模式 新模式
格式),需通过man rename
确认。
相关问答FAQs
Q1: 如何将当前目录下所有以log_
开头的文件重命名为backup_log_
开头?
A: 使用Perl版本的rename
命令,执行rename 's/^log_/backup_log_/' *
,其中^log_
表示匹配以log_
开头的字符串,backup_log_
为替换后的前缀,若使用mv
命令,需结合循环:for f in log_*; do mv "$f" "backup_${f}"; done
。
Q2: 批量重命名时如何忽略特定文件(如保留README.md
不修改)?
A: 可通过find
命令结合rename
实现,find . -maxdepth 1 -type f ! -name 'README.md' -exec rename 's/old/new/' {} \;
,其中! -name 'README.md'
表示排除README.md
文件,-exec
将查找到的文件作为参数传递给rename
,若需更复杂的条件,可在rename
表达式中添加判断,如rename 's/old/new/ unless /README/' *
(Perl版本支持)。