如何在 Linux 中重命名文件(mv 和 rename 命令)?

如何在 Linux 中重命名文件(mv 和 rename 命令)?

编码文章call10242025-07-10 13:33:045A+A-

在Linux中,文件重命名本质上是修改文件或目录的名称,通常涉及更改文件名或移动文件到新路径。mv(move)和rename是两种最常用的命令,各有侧重:

  • mv:Linux的内置命令,用于移动或重命名文件/目录,简单直接,适合单文件操作或基本重命名需求。
  • rename:功能更强大的命令,专为批量重命名设计,支持正则表达式和复杂模式匹配,适合处理大量文件。

接下来,我们将详细探讨这两个命令的用法、选项、实际案例以及注意事项。

mv命令

mv是Linux系统的核心命令之一,集成在coreutils包中,几乎所有Linux发行版默认包含。其基本语法如下:

mv [选项] 源文件 目标文件

常用选项

  • -i:交互模式,覆盖前提示确认。
  • -f:强制覆盖,不提示。
  • -n:不覆盖已存在文件。
  • -u:仅当源文件比目标文件新或目标文件不存在时才覆盖。
  • -v:显示详细操作信息。
  • -b:覆盖前备份目标文件(备份文件以~结尾)。
  • --backup=[METHOD]:自定义备份方式,如--backup=numbered生成编号备份。

mv重命名示例

单个文件重命名

假设有一个文件oldname.txt,需要重命名为newname.txt

mv oldname.txt newname.txt

如果newname.txt已存在,mv会直接覆盖。若需安全操作,可加-i

mv -i oldname.txt newname.txt

移动并重命名

mv不仅能重命名,还能将文件移动到其他目录并改名。例如,将file.txt移动到/tmp并重命名为newfile.txt

mv file.txt /tmp/newfile.txt

批量重命名(结合循环)

虽然mv不直接支持批量重命名,但结合for循环可以实现。例如,将当前目录下所有.txt文件改为.bak

for file in *.txt; do
  mv "$file" "${file%.txt}.bak"
done

这里,${file%.txt}移除文件名的.txt后缀,拼接.bak

备份与覆盖

为避免误覆盖,可使用-b--backup选项。例如:

mv --backup=numbered oldname.txt newname.txt

newname.txt存在,会生成newname.txt.~1~等编号备份文件。

mv命令的优缺点

优点

  • 内置命令,无需额外安装,简单易用。
  • 适合单文件或目录的重命名和移动。
  • 支持交互模式和备份,安全性高。

缺点

  • 不支持复杂模式匹配或正则表达式。
  • 批量重命名需结合脚本,操作稍复杂。

4. 注意事项

  • 路径问题:确保源文件和目标路径存在,否则会报错。
  • 权限检查:重命名或移动需要对源文件和目标目录有写权限。
  • 覆盖风险:不加-i-n可能导致数据丢失,建议养成交互模式习惯。

rename命令

rename命令专为批量重命名设计,支持复杂模式匹配和正则表达式。需要注意的是,Linux中有两个常见版本的rename

  • Perl版renameprenamerename,常见于Debian/Ubuntu):功能强大,支持Perl正则表达式。
  • Util-linux版rename(常见于CentOS/RHEL):功能较简单,适合基本替换。

安装

  • Ubuntu/Debian:sudo apt install rename
  • CentOS/RHEL:sudo yum install renamesudo dnf install rename

Perl版rename基本语法

rename [选项] 's/模式/替换/' 文件

常用选项

  • -n:预览操作(不实际执行)。
  • -v:显示重命名的详细信息。
  • -f:强制覆盖已存在文件。
  • --path:处理完整路径而不仅是文件名。

Util-linux版rename基本语法

rename [选项] 原字符串 新字符串 文件

常用选项

  • -v:显示详细信息。
  • -n:预览操作。
  • -f:强制覆盖。

rename命令示例

Perl版rename

替换文件后缀:将所有.txt文件改为.bak

rename 's/\.txt$/.bak/' *.txt

大小写转换:将文件名中的test改为TEST

rename 's/test/TEST/' *.txt

复杂正则替换:将文件名中的数字加1(如file1.txt变为file2.txt):

rename 's/(\d+)/$1+1/e' *.txt

这里的/e表示执行Perl表达式,$1+1对捕获的数字加1。

处理路径:将/var/log下所有.log文件改为.log.bak

rename --path 's/\.log$/.log.bak/' /var/log/*.log

预览操作:先查看重命名效果:

rename -n 's/\.txt$/.bak/' *.txt

Util-linux版rename

简单字符串替换:将文件名中的old替换为new

rename old new *.txt

后缀替换:将.txt改为.bak

rename .txt .bak *.txt

rename命令的优缺点

优点

  • 支持正则表达式,适合复杂批量重命名。
  • 预览功能(-n)降低误操作风险。
  • Perl版功能强大,灵活性极高。

缺点

  • 需额外安装(部分系统无默认)。
  • Perl版学习曲线稍陡,正则表达式需一定基础。
  • 不同版本语法差异可能导致混淆。

4. 注意事项

  • 版本确认:使用rename --version确认是Perl版还是Util-linux版。
  • 正则表达式测试:Perl版操作前用-n预览,避免错误。
  • 权限与路径:确保有写权限,注意路径中的特殊字符。

高级技巧

1. 结合find命令

findmvrename结合可处理复杂目录结构。例如,重命名所有子目录下的.jpg文件为.jpeg

find . -type f -name "*.jpg" -exec rename 's/\.jpg$/.jpeg/' {} \;

2. 脚本实现复杂重命名

假设需要将文件名中的日期格式从YYYYMMDD改为YYYY-MM-DD(如file20230625.txt变为file2023-06-25.txt):

for file in file*.txt; do
  if [[ $file =~ file([0-9]{4})([0-9]{2})([0-9]{2})\.txt ]]; then
    mv "$file" "file${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}.txt"
  fi
done

3. 处理特殊字符

文件名包含空格或特殊字符时,需加引号或转义。例如:

mv "file with spaces.txt" "new name.txt"

或使用rename处理带空格的文件名:

rename 's/ /_/g' *.txt

4. 批量添加前缀/后缀

为所有.png文件添加前缀img_

rename 's/^/img_/' *.png
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4