我知道我能够用mv命令重命名文件。可是当我想重命名不少文件怎么办?若是为每一个文件都这么作将会是很乏味的。有没有办法一次性重命名多个文件?正则表达式
在Linux中,当你想要改变一个文件名,使用mv命令就行了。然而mv不能使用通配符重命名多个文件。能够用sed、awk或者与xargs结合使用来处理多个文件的状况。然而,这些命令行即繁琐又不友好,而且若是不当心的话还很容易出错。你不会想要撤销1000个文件的错误名吧!安全
当你想要重命名多个文件的时候,rename 工具或许是最简单、最安全和最强大的命令行工具。这个rename命令其实是一个Perl脚本,它预安装在全部的如今Linux发行版上。工具
下面是重命名命令的基本语法。spa
rename [-v -n -f] <pcre> <files>命令行
<pcre> 是Perl兼容正则表达式,它表示的是要重命名的文件和该怎么作。正则表达式的形式是‘s/old-name/new-name/’。blog
‘-v’选项会显示文件名改变的细节(好比:XXX重命名成YYY)。图片
‘-n’选项告诉rename命令在不实际改变名称的状况下显示文件将会重命名的状况。这个选项在你想要在不改变文件名的状况下模拟改变文件名的状况下颇有用。awk
‘-f’选项强制覆盖存在的文件。扩展
下面,就让咱们看下rename命令的几个实际例子。sed
改变文件扩展名
假设你有许多.jpeg的图片文件。你想要把它们的名字改为.jpg。下面的命令就会将.jpeg 文件改为 *.jpg。
$ rename 's/\.jpeg$/\.jpg/' *.jpeg
大写改为小写,反之亦然
有时你想要改变文件名的大小写,你可使用下面的命令。
把全部的文件改为小写:
# rename 'y/A-Z/a-z/' *
把全部的文件改为大写:
# rename 'y/a-z/A-Z/' *
更改文件名模式
如今让咱们考虑更复杂的包含子模式的正则表达式。在PCRE中,子模式包含在圆括号中,$符后接上数字(好比$1,$2)。
好比,下面的命令会将‘imgNNNN.jpeg’变成‘danNNNN.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}’会捕捉4个连续的数字,捕捉的四个数字就是$1, 将会用于新的文件名。