改名,看起来很简单的事情。
在linux下我一直用mv实现文件改名。如果遇到批量改名,则用for循环实现,很是麻烦。今天景杭师弟说用rename,我才根据man帮助详细的做了个测试,发现批量改名用rename真是太方便了。
一、基本用法
从mv和rename命令的man文档中,可以看到如下信息:
mv命令:
NAME
mv - move (rename) filesSYNOPSIS
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...DESCRIPTION
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.Mandatory arguments to long options are mandatory for
short options too.--backup[=CONTROL]
make a backup of each existing destination file-b like --backup but does not accept an argument
-f, --force
do not prompt before overwriting-i, --interactive
prompt before overwrite-n, --no-clobber
do not overwrite an existing file
rename命令:
SYNOPSIS
rename from to file...
rename -VDESCRIPTION
rename will rename the specified files by replacing the
first occurrence of from in their name by to.-V, --version
Display version information and exit.For example, given the files
foo1, ..., foo9, foo10, ..., foo278, the commandsrename foo foo0 foo?
rename foo foo0 foo??
也就是说,mv也能用于改名,但不能实现批量处理(改名时,不支持*等符号的),而rename可以。
rename使用的格式:
[root@ns2 tmp]# rename foo foo0 foo?
rename需要提供三个参数,然后才能决定最终结果。
模拟一下man文档的例子,原文件:
[root@ns2 tmp]# for I in `seq 100`;do touch foo$I;done
[root@ns2 tmp]# ls
foo1 foo18 foo27 foo36 foo45 foo54 foo63 foo72 foo81 foo90
foo10 foo19 foo28 foo37 foo46 foo55 foo64 foo73 foo82 foo91
foo100 foo2 foo29 foo38 foo47 foo56 foo65 foo74 foo83 foo92
foo11 foo20 foo3 foo39 foo48 foo57 foo66 foo75 foo84 foo93
foo12 foo21 foo30 foo4 foo49 foo58 foo67 foo76 foo85 foo94
foo13 foo22 foo31 foo40 foo5 foo59 foo68 foo77 foo86 foo95
foo14 foo23 foo32 foo41 foo50 foo6 foo69 foo78 foo87 foo96
foo15 foo24 foo33 foo42 foo51 foo60 foo7 foo79 foo88 foo97
foo16 foo25 foo34 foo43 foo52 foo61 foo70 foo8 foo89 foo98
foo17 foo26 foo35 foo44 foo53 foo62 foo71 foo80 foo9 foo99
改名结果:
注:红色是被改动过的,蓝色是没有被改变的
[root@ns2 tmp]# rename foo foo0 foo?
[root@ns2 tmp]# ls
foo01 foo100 foo20 foo30 foo40 foo50 foo60 foo70 foo80 foo90
foo02 foo11 foo21 foo31 foo41 foo51 foo61 foo71 foo81 foo91
foo03 foo12 foo22 foo32 foo42 foo52 foo62 foo72 foo82 foo92
foo04 foo13 foo23 foo33 foo43 foo53 foo63 foo73 foo83 foo93
foo05 foo14 foo24 foo34 foo44 foo54 foo64 foo74 foo84 foo94
foo06 foo15 foo25 foo35 foo45 foo55 foo65 foo75 foo85 foo95
foo07 foo16 foo26 foo36 foo46 foo56 foo66 foo76 foo86 foo96
foo08 foo17 foo27 foo37 foo47 foo57 foo67 foo77 foo87 foo97
foo09 foo18 foo28 foo38 foo48 foo58 foo68 foo78 foo88 foo98
foo10 foo19 foo29 foo39 foo49 foo59 foo69 foo79 foo89 foo99
[root@ns2 tmp]# rename foo foo0 foo??
[root@ns2 tmp]# ls
foo001 foo011 foo021 foo031 foo041 foo051 foo061 foo071 foo081 foo091
foo002 foo012 foo022 foo032 foo042 foo052 foo062 foo072 foo082 foo092
foo003 foo013 foo023 foo033 foo043 foo053 foo063 foo073 foo083 foo093
foo004 foo014 foo024 foo034 foo044 foo054 foo064 foo074 foo084 foo094
foo005 foo015 foo025 foo035 foo045 foo055 foo065 foo075 foo085 foo095
foo006 foo016 foo026 foo036 foo046 foo056 foo066 foo076 foo086 foo096
foo007 foo017 foo027 foo037 foo047 foo057 foo067 foo077 foo087 foo097
foo008 foo018 foo028 foo038 foo048 foo058 foo068 foo078 foo088 foo098
foo009 foo019 foo029 foo039 foo049 foo059 foo069 foo079 foo089 foo099
foo010 foo020 foo030 foo040 foo050 foo060 foo070 foo080 foo090 foo100
该例子给出了两种文件批量重命名的用法:
- 第一个参数:被替换掉的字符串
- 第二个参数:替换成的字符串
- 第三个参数:匹配要替换的文件模式
二、匹配模式
rename支持通配符,基本的通配符有以下几个:
* 可替代多个字符
[charset] 可替代charset集中的任意单个字符
2.1 看看*的作用:
[root@ns2 tmp]# rm -rf ./*
[root@ns2 tmp]# for I in `seq 100`;do touch foo$I;done
[root@ns2 tmp]# rename foo foo0 foo*
[root@ns2 tmp]# ls
foo001 foo011 foo021 foo031 foo041 foo051 foo061 foo071 foo081 foo091
foo002 foo012 foo022 foo032 foo042 foo052 foo062 foo072 foo082 foo092
foo003 foo013 foo023 foo033 foo043 foo053 foo063 foo073 foo083 foo093
foo004 foo014 foo024 foo034 foo044 foo054 foo064 foo074 foo084 foo094
foo005 foo015 foo025 foo035 foo045 foo055 foo065 foo075 foo085 foo095
foo006 foo016 foo026 foo036 foo046 foo056 foo066 foo076 foo086 foo096
foo007 foo017 foo027 foo037 foo047 foo057 foo067 foo077 foo087 foo097
foo008 foo018 foo028 foo038 foo048 foo058 foo068 foo078 foo088 foo098
foo009 foo019 foo029 foo039 foo049 foo059 foo069 foo079 foo089 foo099
foo010 foo020 foo030 foo040 foo050 foo060 foo070 foo080 foo090 foo100
上例中所有文件都被改变了
2.2 再看看[charset]的作用:
[root@ns2 tmp]# rm -rf ./*
[root@ns2 tmp]# for I in `seq 100`;do touch foo$I;done
[root@ns2 tmp]# rename foo foo0 foo[8]*
[root@ns2 tmp]# ls
foo08 foo10 foo20 foo31 foo42 foo53 foo64 foo75 foo96
foo080 foo100 foo21 foo32 foo43 foo54 foo65 foo76 foo97
foo081 foo11 foo22 foo33 foo44 foo55 foo66 foo77 foo98
foo082 foo12 foo23 foo34 foo45 foo56 foo67 foo78 foo99
foo083 foo13 foo24 foo35 foo46 foo57 foo68 foo79
foo084 foo14 foo25 foo36 foo47 foo58 foo69 foo9
foo085 foo15 foo26 foo37 foo48 foo59 foo7 foo90
foo086 foo16 foo27 foo38 foo49 foo6 foo70 foo91
foo087 foo17 foo28 foo39 foo5 foo60 foo71 foo92
foo088 foo18 foo29 foo4 foo50 foo61 foo72 foo93
foo089 foo19 foo3 foo40 foo51 foo62 foo73 foo94
foo1 foo2 foo30 foo41 foo52 foo63 foo74 foo95
通过上面的例子可以看出,在批量修改名字方便,rename比mv方便得多。
另外在windows的命令行下,也是使用rename修改文件名,用法也基本一样,如
D:\a>dir
驱动器 D 中的卷没有标签。
卷的序列号是 14B8-6A05D:\a 的目录
2013/08/18 00:17 <DIR> .
2013/08/18 00:17 <DIR> ..
2013/08/18 00:16 0 tt1 - 副本 (2).txt
2013/08/18 00:16 0 tt1 - 副本 (3).txt
2013/08/18 00:16 0 tt1 - 副本 (4).txt
2013/08/18 00:16 0 tt1 - 副本 (5).txt
2013/08/18 00:16 0 tt1 - 副本 (6).txt
2013/08/18 00:16 0 tt1 - 副本.txt
2013/08/18 00:16 0 tt1.txt
7 个文件 0 字节
2 个目录 26,550,697,984 可用字节D:\a>rename tt1* bb1*
D:\a>dir
驱动器 D 中的卷没有标签。
卷的序列号是 14B8-6A05D:\a 的目录
2013/08/18 00:18 <DIR> .
2013/08/18 00:18 <DIR> ..
2013/08/18 00:16 0 bb1 - 副本 (2).txt
2013/08/18 00:16 0 bb1 - 副本 (3).txt
2013/08/18 00:16 0 bb1 - 副本 (4).txt
2013/08/18 00:16 0 bb1 - 副本 (5).txt
2013/08/18 00:16 0 bb1 - 副本 (6).txt
2013/08/18 00:16 0 bb1 - 副本.txt
2013/08/18 00:16 0 bb1.txt
7 个文件 0 字节
2 个目录 26,550,697,984 可用字节D:\a>