在 Linux 中, 我们对文件进行重命名一般都会使用到 mv 命令, 这在对单个文件重命名时非常方便. 但是, 若我们想要对一组文件进行重命名, mv 就有些乏力了. 不过没关系, 今天我们来介绍一个好用的可以实现批量重命名的命令 -- rename 命令.
下面我们来详细介绍 rename 命令的用法.
与 mv 命令不同, rename 命令不是简单地指定新旧文件名就行的. 相反, 它使用与 Perl 类似的正则表达式. 我们先来看下例子.
- $ rename 's/old/new/' this.old
- $ ls this*
- this.new
其中, s 的作用是指定我们使用第二个字符串替换第一个字符串, 从而将 this.old 改为 this.new .
有人可能会问了, 上面的例子我们用 mv this.old this.new 这条命令不是更方便吗? 没错, 但是这样一条命令一次只能重命名一个文件, 而我们今天要做的是一次性重命名一组文件.
要怎么处理呢? 很简单, 来看下面的例子:
- $ ls *.old
- report.old schedule.old stats.old this.old
- $ rename 's/old/new/' *.old
- $ ls *.new
- report.new schedule.new stats.old this.new
由以上结果可见, 通过这个简单的一条命令的操作, 我们可以将当前目录下所有 .old 结尾的文件重命名为 .new 结尾的文件, 简单高效!
如果你认为那是 rename 命令的全部那就是图样图森破了. rename 命令并不局限于更改文件扩展名, 也可以更改文件名中的任意字符串. 比如, 我们如果想要将名为 report.* 的文件更改为 review.* , 则可以使用以下命令:
$ rename 's/report/review/' *
注意, 正则表达式中提供的规则可以更改文件名的任意部分, 无论是文件名还是扩展名.
- $ rename 's/123/124/' *
- $ ls *124*
- status.124 report124.txt
如果你想交互性地使用 rename 进行重命名, 以方便查看都做了哪些更改, 从而避免错误修改, 可以使用 -v 选项.
- $ rename -v 's/123/124/' *
- status.123 renamed as status.124
- report123.txt renamed as report124.txt
-v 选项是要改一条文本时, 给你预览一下, 改一下条时, 再给你预览一下, 而这样效率比较低. 如果我想要整体性地预览, 当确认没有问题时一次性全部修改, 怎么操作呢?
我们可以使用 -n 或 --nono 选项让 rename 命令实现上面的需求.
- $ rename -n 's/old/save/' *
- rename(logger.man-old, logger.man-save)
- rename(lyrics.txt-old, lyrics.txt-save)
- rename(olderfile-, saveerfile-)
- rename(oldfile, savefile)
- rename(review.old, review.save)
- rename(schedule.old, schedule.save)
- rename(stats.old, stats.save)
- rename(this.old, this.save)
如果对上面的这些更改觉得没问题, 那么可以去掉 -n 选项来正式修改文件名.
注意, rename 正则表达式中的 . 不是一般的英文句号, 而是指匹配任意字符的通配符, 我们可以参考下面的命令来理解.
- $ rename -n 's/.old/.save/' *
- rename(logger.man-old, logger.man.save)
- rename(lyrics.txt-old, lyrics.txt.save)
- rename(review.old, review.save)
- rename(schedule.old, schedule.save)
- rename(stats.old, stats.save)
- rename(this.old, this.save)
以上例子里, 不仅 .old 被修改为 .save ,-old 同样也被改为 .save .
如果你想让 . 就是表示一个句号, 需要加一个 \ 转义符号, 即使用 \. 表示英文句号 .
- $ rename -n 's/\.old/\.save/' *
- rename(review.old, review.save)
- rename(schedule.old, schedule.save)
- rename(stats.old, stats.save)
- rename(this.old, this.save)
若要将大写字母都更改为小写字母, 我们可以使用以下命令.
- $ rename -n 'y/A-Z/a-z/' W*
- rename(WARNING_SIGN.PDF, warning_sign.PDF)
- rename(Will_Gardner_buttons.PDF, will_gardner_buttons.PDF)
- rename(Wingding_Invites.PDF, wingding_invites.PDF)
- rename(WOW-buttons.PDF, wow-buttons.PDF)
其中, 使用 -n 预览将要进行的更改, y 表示更改大小写.
在上面的示例中, 我们将所有以大写字母 W 开头的文件名全部改为小写字母.
总结
如果想要对单个文件进行重命名, 可以使用 mv 命令. 而如果想对一组文件进行重命名, 那么使用 rename 命令更方便, 注意, 使用 rename 命令最好加上 -n 选项, 先预览将要进行的更改, 确认无误后再进行重命名, 避免意外出现.
-----------------
我是良许, 世界 500 强外企 Linux 开发工程师, 专业生产 Linux 干货. 欢迎关注我的公众号「良许 Linux」, 里面分享了 Linux 入门, 基础, 进阶 等系列教程, 同时也有 Git,VIM, 开源项目 等技术干货.
来源: https://segmentfault.com/a/1190000020943542