rename

rename命令用字符串替换的方式批量改变文件名。



语法
rename(参数)
参数
原字符串:将文件名需要替换的字符串;
目标字符串:将文件名中含有的原字符替换成目标字符串;
文件:指定要改变文件名的文件列表。
实例
将main1.c重命名为main.c



rename main1.c main.c main1.c
rename支持通配符



? 可替代单个字符



  • 可替代多个字符
    [charset] 可替代charset集中的任意单个字符
    文件夹中有这些文件foo1, …, foo9, foo10, …, foo278

    如果使用rename foo foo0 foo?,会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0。



如果使用rename foo foo0 foo??,foo01到foo99的所有文件都被重命名为foo001到foo099,只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0。



如果使用rename foo foo0 foo*,foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名。



如果使用rename foo0 foo foo0[2]*,从foo0200到foo0278的所有文件都被重命名为foo200到foo278,文件名中的foo0被替换为foo。



rename支持正则表达式



字母的替换



rename “s/AA/aa/” * //把文件名中的AA替换成aa
修改文件的后缀



rename “s//.html//.php/” * //把.html 后缀的改成 .php后缀
批量添加文件后缀



rename “s/$//.txt/” * //把所有的文件名都以txt结尾
批量删除文件名



rename “s//.txt//” * //把所有以.txt结尾的文件名的.txt删掉
如我们想把文件扩展名为.bak 的文件扩展名去掉,可以这样



$ rename ‘s/.bak$//’ *.bak
*.bak 为通配符(wildcard),会被shell展开为各个文件名
去除文件名中的空格



$ rename ‘s/ //g’ *
g 是global的意思,替换所有的空格为空字符(也就是删除啦)
文件名转为小写
$ rename ‘y/A-Z/a-z/’ *
使用分组
现在有一堆文件,他们的文件名模式是这样的第一部分-haha-第二部分.file ,现在要把中间的-haha- 删去并把第一部分的字符串和第二部分的字符串对调,可以这样:
$ rename ‘s/(.)-haha-(.)(.file)/221$3/’ *.file



https://www.php.net/rename
man rename是调用操作系统的命令。Perl语言也有rename方法,这个方法自然需要在Perl语言环境里运行,也就是写在Perl可运行语言文件里。类似:



#!/usr/bin/perl
use strict;
use warnings;
use utf8;



my $oldname = ‘11.txt’;
my $newname = ‘22.txt’;



if( rename($oldname, $newname) ) {
print ‘重命名成功!’;
} else {
print ‘重命名失败!’;
}



man rename 看到第一行是
RENAME(1) Linux Programmer’s Manual RENAME(1)
这个就是C语言版本的。
而如果出现的是:
RENAME(1) Perl Programmers Reference Guide RENAME(1)
这个就是Perl版本的了!
我这里是C语言版的。
比如我要在命令行使用Perl版的:rename ‘s/ /_/g *’替换空格


Category linux