rename 批量修改文件名

From:http://www.javashuo.com/article/p-dfwdewiw-v.htmlhtml

rename与mv的区别就是mv只能对单个文件重命名,而rename能够批量修改文件名linux

linux中的rename有两种版本,一种是C语言版的,一种是Perl版的,如何区分系统里的rename是哪一个版本的,能够经过一下方式:正则表达式

输入man rename 看到第一行中包含Linux Programmer’s Manual时,这就是C语言版本的,若是第一行中包含 Perl Programmers Reference Guide,则就是Perl版本的。ide

Perl语言版本的rename用法

perl版本的rename同sed中的语法相似,rename perl正则表达式 待处理的文件

替换 rename 's/.rtv.txt.kml/.kml/' *.kml 或者rename 's/foo0/foo/' foo0[2]* 将foo02开头的文件名中的foo0替换为fooui

删除某些字符  rename 's/gps_//' *.kml或者rename 's/.bak$//' *.bakspa

其中,?可替代单个字符*可替代多个字符,三种通配符能够一块儿结合使用。命令行

实例:htm

把全部文件名内含有大小字母的,修改成小写字母:rename 'y/A-Z/a-z/' *.txt 对象

linux中容许文件名中包含空格,但文件名中有空格时,在命令行调用文件时要将文件名用双引号引发来或者对空格进行转义才能行,去除文件名中空格的实现命令有如下两种方式:blog

    1. find . -type f -name "* *" -print |while read name; do mv "${name}" `echo "${name}"|sed "s/[ ]\+/_/g"`;done
    2. rename "s/[ ]+/_/g" *
    • 其中[ ]+表示空格出现一次或屡次,空格能够用[:space:]代替,该命令可替换为[[:space:]]+
    • 在sed中须要将+转义,但在rename中不能转义,由于rename 采用的是标准perl正则语法
    • 从命令中可以看到sed与rename的区别,rename处理的是*所能匹配到的该目录下的全部文件,它将全部文件名做为处理的对象,而命令sed 处理逻辑 文件名时,sed 处理的是文件内容,因此只能经过echo "文件名"|sed "s/[ ]\+/_/g的方式才能处理文件名

  rename 's/^/hello/' * 统一在文件头部添加上hello 

  rename 's/.html$/.htm/' * 统一把.html扩展名修改成.htm

  rename 's/$/.zip/' * 统一在尾部追加.zip后缀:

  rename 's/.zip$//' * 统一去掉.zip后缀

  规则化数字编号名,好比1.jpg, 2.jpg ..... 100.jpg , 如今要使文件名所有三位即1.jpg .... 001.jpg,运行两次命令:

  1. rename 's/^/00/'  [0-9].jpg # 这一步把1.jpg ..... 9.jpg 变幻为001.jpg .... 009.jpg
  2. rename 's/^/0/' [0-9][0-9].jpg # 这一步把10.jpg ..... 99.jpg 变幻为010.jpg ..... 090.jpg

C语言版本rename的用法

     rename 原字符串 需改为的字符串 须要修改的文件

  rename 'test' 'tast' *.txt,将文件名中的test改成tast

  rename .jpeg.jpg *.jpeg  修改文件的扩展名

总的来讲:rename C语言版本所能实现的功能:批量修改文件名,结果是每一个文件会被相同的一个字符串替换掉!也就是说,没法实现诸如循环 而后按编号重命名等

应用实例:

1.批量修改文件前缀

场景:folder A中有a.rtv b.a.c.imu a.t.gps a.y.ew.imu等等,想要将这些文件的文件名统一为test,后缀保持不变

通常的思路:

遍历folder,依次获取文件 ---> 获取文件后缀${pre}--->使用mv ${file}  test.${pre}

该方法中没有文件都要获取后缀再执行mv命令,灰常复杂

rename方法:rename 's/.*\./test./' *便可,其中.*\.中.*表明匹配屡次单个字符,\.表明对点进行转义。

相关文章
相关标签/搜索