放大啦资源网 http://www.fangdala.com
当前位置首页 > 百科资料> 正文

rename

2023-02-02 12:18:56 暂无评论 百科资料

rena脸其往me是一条Linux命来自令。

  • 外文名称 rename
  • 功能 给文件重命名
  • 地方 计算机

  Linux中rename和mv都可以对文件重命名,在此对rename命令和mv命令在重命名文件方面做一个比较。

  可以看到mv命令确实有重命名的功能,但是实际应用中,它只能对单个文件重命名,命令如下:

  "mv命令只能对单个文件重命名",这实就是mv命令和rename命令的在重命名方面的根本区别。

  再来说rename命令,rename命令是专用于文件了第易危轴损重命名的,而且根据其后的例子可以看出,rename除了给单个文件重命名,还可以批量文件重命名。

  Linux的rename命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux来自发行版基本上使用的是C语言版本的,现在已经很难见到360百科C语言版本的了,由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C版本的都被Perl改写了,因为Perl版本的支持正则处理,所以从扩拿写兰小变功能更加强大,已导门充七山并田求序探经不再需要C语言版风殖岁色其常仅本的了。

区分rename命令的版本

  输入man rename看到第一行是

  那么这个就是C语言版本的。

  而如果出现的是:

  这个就是Perl版然红序积送紧式践沿叫本的了!

两个版本的语法基本差异

C语言的参数格式

  按照man封室上面的注解,rena搞但商护省技实口me的语法格式是:

固季乡旧笔证  这个命令有三个参数,分别是from : 修改什么名字,to:改成什么名字,file 需要修改的文件是哪些。

Perl版本的参数格式

  注意,Perl版本的rename只有两个参数,第一个参数为Perl正则表达式,第二个参数为所要处理的文件

C语言版本的rename

  值得注意一点的是,C语言版本的r来自ename命令是带3个参数而不是很多人认为的2个360百科参数。

  上面的误征己名今船类界厂关例子中给出了两种文件门胜马办胞领批量重命名的用法,而实际上,rename结合通配符使用,它的功能比上面的例子所显示的更强大。基本的通配符有以体尔认通些关写指渐收体下几个:

  ? 可替代单绝击危真错写袁微信阳祖个字符

  * 可替代多个字符

  [charset] 可替代charset集中的任意单个字符

  rename把文件名中的第一个参数字符串用第二个参数替换,只替换符合第三个参数模式的文件名。

  下面以例子加以说明:

  如文件则超盐右顾每则面家愿降夹中有这些文件foo1、...foo9、foo10、...foo278,如果使用

  则它只会把foo1到foo9的文件重命名为foo01到foo09,因为?通配符只能替代单个字符宜挥学车起月沙序输,所以被重命名的文件只是有4个建画级南巴必给用字符长度名称的文件,文件名中的foo被替换为foo0。

  再继续使用

  则文件夹中的foo01到foo99的所有文件都被重命名为foo001到foo099,而foo100及其以后的文件名都不变,因为通配增五紧息掉础符?的使用,所以只重命名5个字符长度名称的文件,文件名中的foo被替换为foo0。

  如果再继续使用

  则立多望干保再士毛践兰宁foo001到foo278的所有文件都被重命名为foo0001到foo0278,因为通配符终草垂把延农境唱*可替代多个字符,所以,所有以foo开头的文件都被重命名了,文件名中的foo被替换为foo0。

  我们再来看通配符[charset]的用法,还是继续在上面所说的文件夹中,执行如下命令

  则从foo0200到foo0278的所有文件都被重命名为foo20跑庆般赶集火0到foo278,文件名中的foo0被替换为foo。

Perl语言版本的rename

  带有Perl的好处胡回急团停静护是,你可以使用正则表达式来完成很奇特的功能。

限刑含转九包胜据落  man rename的帮助示例:

  1) 有一批文件,以.bak结尾,现在想把这些.bak统统去掉。

  这个命令很简单,因为我还没有系统学习过Perl,我不知道Perl里替换字符串是不是这么干的,但sed是这么干的,所以如果你有sed或者tr基础,很容易明白,这个替换和sed里的正则语法是一模一样的。

  2) 把所有文件名内含有大小字母的,修改为小写字母。

  依然和sed的替换语法一样,不用多解释,如果看不懂的话,可以系统学习一下sed先。

  还有几个比较实用的例子:

  1)批量去掉文件名里的空格

  Linux文件名本来是不支持空格的,不知道什么时候允许了,当照岩奏得么石本然,在命令行调用文件的时候,空格是很有问题滴,比如你原来可以直接

  但有空格就不行了,得加双引号:

  或者用反斜杠转移 \[] ,这样还好,但如果你直接把含有空格的图片名引入Latex文档,Latex生成pdf的时候会直接打印出文件名,之前这个问题苦恼了我很久,我生成的pdf怎么老是出现文件名呢?后来才发现原来是文件名内含有空格的问题!Windows系统下生成的文件名是天生含有空格的,虽然很讨厌,但有些惠普扫描仪生成的图片燃现带块过此流鸡诗尔江默认就加入了空格,没有办法,只好去掉他,在系统研究rename命令前,我是用mv去除空格的。

 容眼学阳织太成际改联 网上流程的两个去空格的版本:

  1) tr 版:

  这个版本以前我一直用的,不知道哪个网上搜刮来的,当时还没有系统的学习过tr/sed/awk命令。

  注解一下,很好理解,

  这一句是查找怕强各军刘兰段当前目录下所有类型为普通文件的 并且名字之中含有空格的文件,并打印出来,其实find默认就是打印的这个-print多余了,然后通过管道传输给while循环读取,文件名放到name变量里,用tr命令替换空格为下划线。下面判断如果执行后的名称不相同,使用mv命令重命名。但这个if判断可有可无,因为find已经查询了所有文件名中含有空格的,那么经过tr命令后,$na变量肯定不等于$name变量的。

  所以这段代码可以简化:

  tr可以看着是sed的一个精简版本,tr用下划线来替换空格。

  还有一个是sed版本实现:

  这里的sed表达式还可以这样写:

  不过记住,sed里的出现一次或多次的加号是需要添加反斜杠的。即:\+,这样就可以了。

  好了,这两种办法都太罗嗦了,看看rename实现吧:

  OK就这么简单。

  方括号内的空格可以用[:space:]代替,即可以写成

  这里注意,rename采用的是标准Perl正则语法,所以无须将加号转变为反斜杠加号

  即+不能修改为\+,否则替换失败。

  还有几个好玩的例子:

  比如统一在文件头部添加上hello

  统一把.html扩展名修改为.htm

  统一在尾部追加.zip后缀:

  统一去掉.zip后缀:

  规则化数字编号名,比如1.jpg, 2.jpg ..... 100.jpg , 现在要使文件名全部三位即1.jpg .... 001.jpg

  运行两次命令:

  Ok ,rename就研究了这么多,暂时不知道如何在rename中引入动态变量,比如$i++

  我测试过

  执行后i被自增了1,并非想我想像中那样,可以在每操作一个文件自增一,猜想可能是因为rename批量实现的,导致++i只计算一次!

  -n 用来测试rename过程,并不直接运行,可以查看测试效果后,然后再运行。

  好了,再次说明一下,你在使用的时候一定要确认一下你语言的版本……

猜你喜欢