用perl按目录名批量更改文件名
提供测试文件目录结构以及perl脚本打包下载。
http://www.vetcafe.net/blog/up/1132403634.gz
下载后扩展名更改为tar.gz解压缩。
需求:
原来目录里的格式为:
Code: |
[root@centos chmov]# ls -R .: 电影 电视 ./电影: 动作 爱情 ./电影/动作: 方大玉 黄飞鸿 ./电影/动作/方大玉: 1.rmvb 2.rmvb ./电影/动作/黄飞鸿: 1.rmvb 2.rmvb ./电影/爱情: 纯真年代 薰衣草 ./电影/爱情/纯真年代: 1.rmvb 2.rmvb ./电影/爱情/薰衣草: 1.avi 2.avi ./电视: 中国 韩国 ./电视/中国: 大宅门 红楼梦 ./电视/中国/大宅门: 1.wmv 2.wmv 3.wmv ./电视/中国/红楼梦: 1.avi 2.avi 3.avi ./电视/韩国: 浪漫漫屋 ./电视/韩国/浪漫漫屋: 1.rmvb 2.rmvb 3.rmvb |
现在要根据目录名吧 1.rmvb 2.wmv这样文件改成路径名加上原来的文件名如:
电影_爱情_纯真年代1.rmvb
电视_中国_大宅门2.wmv
让每个文件拥有完全的信息,方便在emule里被索引。
解决问题的perl脚本:
Code: |
[root@centos chmov]# cat chmov.pl #!/usr/bin/perl #################################################### #### sleetdrop@gmail.com #### change the files name from it's original #### name to pathname plus it's original name. #### put this script in the beginning dir and run #################################################### @paths=(); sub chmovname{ for $file (glob "*"){ if(-d $file){ push @paths, $file; chdir $file; &chmovname; } if(-f $file){ $newfile=join "_", @paths; $newfile.=$file; rename $file, $newfile; } } chdir "../"; pop @paths; } &chmovname; |
执行结果:
Code: |
[root@centos chmov]# ./chmov.pl [root@centos chmov]# ls -R .: chmov.pl 电影 电视 ./电影: 动作 爱情 ./电影/动作: 方大玉 黄飞鸿 ./电影/动作/方大玉: 电影_动作_方大玉1.rmvb 电影_动作_方大玉2.rmvb ./电影/动作/黄飞鸿: 电影_动作_黄飞鸿1.rmvb 电影_动作_黄飞鸿2.rmvb ./电影/爱情: 纯真年代 薰衣草 ./电影/爱情/纯真年代: 电影_爱情_纯真年代1.rmvb 电影_爱情_纯真年代2.rmvb ./电影/爱情/薰衣草: 电影_爱情_薰衣草1.avi 电影_爱情_薰衣草2.avi ./电视: 中国 韩国 ./电视/中国: 大宅门 红楼梦 ./电视/中国/大宅门: 电视_中国_大宅门1.wmv 电视_中国_大宅门2.wmv 电视_中国_大宅门3.wmv ./电视/中国/红楼梦: 电视_中国_红楼梦1.avi 电视_中国_红楼梦2.avi 电视_中国_红楼梦3.avi ./电视/韩国: 浪漫漫屋 ./电视/韩国/浪漫漫屋: 电视_韩国_浪漫漫屋1.rmvb 电视_韩国_浪漫漫屋2.rmvb 电视_韩国_浪漫漫屋3.rmvb |
我知道这个很幼稚,但自己记性不好,留在这里做存根,说不定以后还需要参考。