千家信息网

Linux 中怎么使用rename命令批量重命名

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇文章为大家展示了Linux 中怎么使用rename命令批量重命名,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如何区分系统里的rename命令是哪个版本的
千家信息网最后更新 2026年11月02日Linux 中怎么使用rename命令批量重命名

本篇文章为大家展示了Linux 中怎么使用rename命令批量重命名,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

如何区分系统里的rename命令是哪个版本的?

输入 man rename 看到第一行是

RENAME(1) Linux Programmer’s Manual RENAME(1)

那么 这个就是C语言版本的。

而如果出现的是:

RENAME(1) Perl Programmers Reference Guide RENAME(1)

这个就是Perl版本的了!

两个版本的语法差异:

C语言的,按照man上面的注解,

rename的语法格式是:

rename fromtofile

这个命令有三个参数,分别是 from : 修改什么名字, to:改成什么名字, file 需要修改的文件是哪些。

用法示例:

比如,有一批文件,都是以 log开头的, log001.txt, log002.txt ……. 一直到 log100.txt

现在想要把这批文件的log全部替换为 history

rename log history log*

这句命令的意思很明白了,把 以 log开头的所有文件中的 log字符替换为 history

这样替换后的文件是: history001.txt, history002.txt ….. 一直到 history100.txt

rename C语言版本的另一个man示例是把后缀名批量修改,

比如我们要将所有 jpeg的后缀名图片文件修改为 jpg文件。

rename .jpeg.jpg*.jpeg

这样,所有以 .jpeg扩展的后缀名全部被修改为 .jpg

现在总结一下rename C语言版本所能实现的功能: 批量修改文件名,结果是每个文件会被用相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名!

Perl 版本的批量重命名,带有Perl的好处是,你可以使用正则表达式来完成很奇特的功能。

perl 版本的参数格式:

rename perlexprfiles

注意,perl版本的rename只有两个参数,第一个参数为perl正则表达式,第二个参数为所要处理的文件

man rename的帮助示例:

1) 有一批文件,以 .bak结尾,现在想把这些 .bak 统统去掉。

rename 's/\.bak$//' *.bak
这个命令很简单,因为我还没有系统学习过perl,我不知道perl里替换字符串是不是这么干的,但sed是这么干的,所以如果你有sed或者tr基础,很容易明白,这个替换和sed里的正则语法是一模一样的。

2) 把所有文件名内含有大小字母的,修改为小写字母。

rename 'y/A-Z/a-z/' *
依然和sed的替换语法一样,不用多解释,如果看不懂的话,可以系统学习一下sed先。

还有几个比较实用的例子:

批量去掉文件名里的空格

Linux文件名本来是不支持空格的,不知道什么时候允许了,当然,在命令行调用文件的时候,空格是很有问题滴,比如你 原来可以直接 mv oldfile newfile 但有空格就不行了 , 得加双引号: mv "oldfile" "newfile" 或者用反斜杠转移 \[] ,这样还好,但如果你直接把含有空格的图片名引入 Latex文档,Latex生成pdf的时候会直接打印出文件名,之前这个问题苦恼了我很久,我生成的pdf怎么老是出现文件名呢?后来才发现原来是文件名内含有空格的问题!windows系统下生成的文件名是天生含有空格的,虽然很讨厌,但有些惠普扫描仪生成的图片默认就加入了空格,没有办法,只好去掉他,在系统研究rename命令前,我是用 mv 去除空格的。

网上流程的两个去空格的版本:

1) tr 版:


代码如下:


find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')
if [[ $name != $na ]]; then
mv "$name" $na
fi
done

这个版本以前我一直用的,不知道哪个网上搜刮来的,当时还没有系统的学习过 tr/sed/awk命令。

注解一下,很好理解, find . type f -name "* *" -print 这一句是查找当前目录下所有类型为普通文件的 并且名字之中含有空格的文件,并打印出来,其实 find默认就是打印的 这个 -print 多余了,然后 通过管道传输给 while 循环读取,文件名放到 name 变量里,用 tr 命令 替换空格为 下划线。 下面判断如果执行后的名称不相同,使用 mv 命令重命名。但这个if判断可有可无,因为find已经查询了所有文件名中含有空格的,那么经过 tr 命令后, $na变量肯定不等于 $name 变量的。

所以这段代码可以简化:

代码如下:


find . -type f -name "* *" |
while read name; do
na=$(echo $name | tr ' ' '_')
mv "$name" "$na" 
done

tr 可以看着是 sed 的一个精简版本,tr 用下划线来替换空格。

还有一个 是 sed 版本实现:

for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done
这里的 sed表达式还可以这样写:

sed 's/[[:space:]]\+/_/g'
不过记住,sed里的出现一次或多次的加号是需要添加反斜杠的。即:\+

这样就可以了。

好了,这两种办法都太他妈罗嗦了,看看rename实现吧:

rename 's/[ ]+/_/g' *
OK就这么简单。

方括号内的空格可以用 [:space:]代替,

即可以写成 ‘s/[[:space:]]+/_/g’

这里注意,rename 采用的是标准perl正则语法,所以无须将 加号转变为反斜杠加号 。即 + 不能修改为 \+,否则替换失败。

还有几个好玩的例子:

比如统一在文件头部添加上 hello

rename 's/^/hello/' *
统一把.html扩展名修改为 .htm

rename 's/.html$/.htm/' *
统一在尾部追加 .zip后缀:

rename 's/$/.zip/' *
统一去掉.zip后缀:

rename 's/.zip$//' *
规则化数字编号名,比如 1.jpg, 2.jpg ….. 100.jpg , 现在要使文件名全部三位即 1.jpg …. 001.jpg

运行两次命令:

代码如下:


rename 's/^/00/' [0-9].jpg
# 这一步把 1.jpg ..... 9.jpg 变幻为 001.jpg .... 009.jpg
rename 's/^/0/' [0-9][0-9].jpg
# 这一步把 10.jpg ..... 99.jpg 变幻为 010.jpg ..... 090.jpg

Ok ,rename就研究了这么多,暂时不知道如何在rename中引入动态变量,比如 $i++

我测试过 i=0; rename -n "s/^.*$/$((++i))/" * 执行后i被自增了1,并非想我想像中那样,可以在每操作一个文件自增一,猜想可能是因为rename批量实现的,导致++i只计算一次!

-n 用来测试rename过程,并不直接运行,可以查看测试效果后,然后再运行。

上述内容就是Linux 中怎么使用rename命令批量重命名,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

文件 命令 版本 空格 文件名 系统 参数 后缀 语法 代码 变量 就是 正则 语言 生成 统一 两个 加号 名字 图片 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 互联网科技公司 西安纸贵互联网科技有限公司 互联网科技美容 国外互联网科技网站 互联网养老 桔豆科技 互联网科技革命什么开始 阿大互联网科技有限公司 健康食品互联网创新科技园项目 玉溪新华互联网科技好不好 济南有互联网科技公司吗 华中科技大学互联网的牛人 美国互联网科技实力 沐思想互联网科技有限公司 中国互联网公司的科技投入 美国五大互联网科技公司市值多少 上海旺乐尼互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司 科技互联网企业在行动 前海云享互联网科技 互联网科技缩写 碳银互联网科技有限公司 互联网科技公司介绍 互联网科技大会案例 央行互联网金融科技公司 中国科技创新与世界互联网大会 深圳市罗太互联网科技有限公司 雨阳互联网卡科技有限公司 科技互联网行业投资研究 版纳互联网科技选哪家
0