linux⽂件重命名
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后缀
批量添加⽂件后缀
仙剑奇缘3rename “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
mv
mv命令既可以重命名,⼜可以移动⽂件或⽂件夹。
例⼦:将⽬录A重命名为B
mv A B
例⼦:将/a⽬录移动到/b下,并重命名为c
mv /a /b/c
其实在⽂本模式中要重命名⽂件或⽬录,只需要使⽤mv命令就可以了,⽐如说要将⼀个名为abc的⽂件重命名为1234:
mv abc 1234
注意,如果当前⽬录下也有个1234的⽂件的话,这个⽂件是会将它覆盖的。
批量创建那些规格差不多的⽂件名。【测试的第⼀步】
[root@linuxidc net]# for i in `seq -w 10`
> do touch stu\_$i\_linux.jpg
> done
[root@linuxidc net]# sl
total 0
向华胜-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_01_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_08_linux.jpg
-
rw-r--r-- 1 root root 0 Oct 9 21:22 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_10_linux.jpg
然后,使⽤rename进⾏修改
[root@linuxidc net]# rename \_linux '' *.jpg
[root@linuxidc net]# sl
吴尊的老婆林丽莹total 0
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_01.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_02.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_03.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_04.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_05.jpg
-
rw-r--r-- 1 root root 0 Oct 9 21:22 stu_06.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_07.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_08.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_09.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:22 stu_10.jpg
注意,如果想要替换掉下划线,那么你不能加任何引号。
创建⼀些测试⽂件:
[root@linuxidc net]# for i in `seq -w 10`; do touch stu\_$i\_linux.jpg; done
[root@linuxidc net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_01_linux.jpg
-
rw-r--r-- 1 root root 0 Oct 9 21:58 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_08_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:58 stu_10_linux.jpg
[root@linuxidc net]# rename '\_linux' '' *.jpg
[root@linuxidc net]# sl
total 0
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_01_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_02_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_03_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_04_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_05_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_06_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_07_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_08_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_09_linux.jpg
-rw-r--r-- 1 root root 0 Oct 9 21:27 stu_10_linux.jpg
rename版本如果是perl版本的,那rename命令是⽀持正则的;因此在perl版本的rename下,执⾏上述命令就可以成功,如果rename版本是c版本的,那么上述命令是不成功的。这个是版本⽀持的问题,所以不必深究。有关⼆个版本的⽐较,请参考:linux下rename命令批量重命名中的详细介绍。
计算机等级证书查询
之前的问题可能是因为他的rename版本不⽀持导致的。so,这⾥重点说的就是rename,虽然这个命令不是很重要。但是它其实还是很有⽤的,不是吗?
当然,有⼈会说,你这个都是在⼀个⽬录下,那我要是在不同的⽬录下呢?
⽤两个命令。⼀个find先把要修改的⽂件出来,再接⼀个管道,⼀个rename不就完了吗?
是的,上述办法可以说是⼀种思路,其实有很多种思路。
附,查看rename版本的信息
[root@linuxidc net]# man rename | head -1
RENAME(1) Linux Programmer’s Manual RENAME(1)