rename 批量修改文件名

From:https://www.cnblogs.com/lly001/p/10221021.html

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

linux中的rename有两种版本,一种是C语言版的,一种是Perl版的,如何区分系统里的rename是哪个版本的,可以通过一下方式:

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

Perl语言版本的rename用法

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

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

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

其中,?可替代单个字符*可替代多个字符,三种通配符可以一起结合使用。

实例:

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

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

    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语言版本所能实现的功能:批量修改文件名,结果是每个文件会被相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名等

猜你喜欢

转载自www.cnblogs.com/mianbaoshu/p/11772876.html