现在的位置: 首页 > Linux > Linux基础 > 正文
使用rename实现批量文件改名
2013年08月17日 Linux基础 ⁄ 共 5628字 使用rename实现批量文件改名已关闭评论 ⁄ 被围观 15,051 views+

改名,看起来很简单的事情。

在linux下我一直用mv实现文件改名。如果遇到批量改名,则用for循环实现,很是麻烦。今天景杭师弟说用rename,我才根据man帮助详细的做了个测试,发现批量改名用rename真是太方便了。

一、基本用法

从mv和rename命令的man文档中,可以看到如下信息:

mv命令:

NAME
mv - move (rename) files

SYNOPSIS
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 -V

DESCRIPTION
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 commands

rename 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-6A05

D:\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-6A05

D:\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>

抱歉!评论已关闭.

×