c语⾔批量更改⽂件名,rename批量修改⽂件名
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/.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
find . -type f -name "* *" -print |while read name; do mv "${name}" `echo "${name}"|sed "s/[ ]\+/_/g"`;done
成本会计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,运⾏两次命令:
rename 's/^/00/' [0-9].jpg # 这⼀步把1.jpg ..... 9.jpg 变幻为001.jpg .... 009.jpg
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 w.imu等等,想要将这些⽂件的⽂件名统⼀为test,后缀保持不变⼀般的思路:
遍历folder,依次获取⽂件 ---> 获取⽂件后缀${pre}--->使⽤mv ${file} test.${pre}
该⽅法中没有⽂件都要获取后缀再执⾏mv命令,灰常复杂
rename⽅法:rename 's/.*\./test./' *即可,其中.*\.中.*代表匹配多次单个字符,\.代表对点进⾏转义。
发布评论