如何在 Linux 上重命名多个文件
问题:我知道我可以使用
mv
命令重命名文件。但是如果我想更改许多文件的名称怎么办?对每个这样的文件调用mv
命令会很乏味。有没有更方便的方法来一次重命名多个文件?
在 Linux 中,当您想要更改文件名时,mv
命令即可完成工作。但是,mv
无法使用通配符重命名多个文件。有多种方法可以通过将 sed
、awk
或 find
与 xargs
结合使用来处理多个文件。然而,这些 CLI 相当麻烦,而且用户界面不友好,如果不小心的话,很容易出错。您不想撤消对数千个文件所做的错误名称更改。
当涉及到重命名多个文件时,rename
实用程序可能是最简单、最安全且最强大的命令行工具。 rename
命令实际上是一个 Perl 脚本,并且预装在所有现代 Linux 发行版上。
这是rename
命令的基本语法。
rename [-v -n -f] <pcre> <files>
<pcre>
是一个与 Perl 兼容的正则表达式 (PCRE),它表示要重命名的文件以及如何重命名。该正则表达式的形式为“s/old-name/new-name/
”。
-v
选项显示文件名更改的详细信息(例如,XXX 重命名为 YYY)。
-n
选项告诉 rename
显示如何在不实际更改名称的情况下重命名文件。当您想要模拟文件名更改而不接触文件时,此选项非常有用。
-f
选项强制覆盖现有文件。
下面我们来看几个rename
命令示例。
更改文件扩展名
假设您有许多扩展名为 .jpeg
的图像文件。您想要将这些图像的文件扩展名更改为*.jpg
。以下命令将 *.jpeg
文件转换为 *.jpg
。
$ rename 's/.jpeg$/.jpg/' *.jpeg
将大写字母转换为小写字母,反之亦然
如果您想更改文件名中的文本大小写,可以使用以下命令。
要将所有文件重命名为小写:
# rename 'y/A-Z/a-z/' *
要将所有文件重命名为大写:
# rename 'y/a-z/A-Z/' *

更改文件名模式
现在让我们考虑涉及子模式的更复杂的正则表达式。在 PCRE 中,圆括号内捕获的子模式可以由前面带有美元符号的数字引用(例如,$1
、$2
)。
例如,以下命令会将 img_NNNN.jpeg
重命名为 dan_NNNN.jpg
。
# rename -v 's/img_(d{4}).jpeg$/dan_$1.jpg/' *.jpeg
img_5417.jpeg renamed as dan_5417.jpg
img_5418.jpeg renamed as dan_5418.jpg
img_5419.jpeg renamed as dan_5419.jpg
img_5420.jpeg renamed as dan_5420.jpg
img_5421.jpeg renamed as dan_5421.jpg
下一个命令会将 img_000NNNN.jpeg
重命名为 dan_NNNN.jpg
。
# rename -v 's/img_d{3}(d{4}).jpeg$/dan_$1.jpg/' *jpeg
img_0005417.jpeg renamed as dan_5417.jpg
img_0005418.jpeg renamed as dan_5418.jpg
img_0005419.jpeg renamed as dan_5419.jpg
img_0005420.jpeg renamed as dan_5420.jpg
img_0005421.jpeg renamed as dan_5421.jpg
在上述两种情况下,子模式“d{4}
”捕获四个连续数字。捕获的四位数字将被称为 $1
,并用作新文件名的一部分。