Perl 文件重命名批处理
经过一个多月的努力,终于把公司的新站做好了。前几天我已经把代码从开发服务器拷贝到主服务器上了,只是用了不同的文件名。今天早上8:30开始割接 - 让网站使用新的代码。为了让转换的过程更加迅速,我编写了Perl脚本来代替手动文件备份和重命名。
具体要完成的工作是:
- 1. 从指定根目录开始搜索新的代码文件,这写新的文件命名规则为:filename_new.tpl, 也就是在实际文件后加了"_new"。
- 2. 备份原有文件, 命名规则:filename_bak.tpl
- 3. 把新文件重命名,filename_new.tpl » filename.tpl
因为需要处理的文件分布在不同的路径下面,而且路径也分好几级,所以我用到了Perl的Find模块。具体代码如下:
#!perl -wuse strict;use File::Find;my %directories;my @newfiles;find( \&filehandler, "/var/www/smarty/" );for my $file_new ( sort keys %directories ) {my @dirlist = @{$directories{ $file_new } };(my $file_ori = $file_new) =~ s/_new//;(my $file_bak = $file_new) =~ s/_new/_bak/;for (@dirlist){my $dir = $_;if (-e "$dir\/$file_bak"){die "$dir\/$file_new was renamed";}else{if(rename "$dir\/$file_ori", "$dir\/$file_bak"){print "$dir\/$file_ori is backup\n";}else{ warn "!ERROR: rename $dir\/$file_ori failed\n";}if(rename "$dir\/$file_new", "$dir\/$file_ori"){print "$dir\/$file_new is renamed to $file_ori\n\n";}else{ warn "!ERROR: rename $dir\/$file_ori failed\n";}}}}sub filehandler {#只查找文件,跳过路径return unless -f $File::Find::name;# Just take the filenamemy $nameonly = $_;return unless $nameonly =~ m/.+_new\..+$/i;#push (@newfiles, $nameonly);$directories{ $nameonly } = [] unless defined $directories{ $nameonly };push( @{$directories{ $nameonly } }, $File::Find::dir );}
以上代码仅供参考,如果你要完成类似的工作,要根据你自己的情况修改代码。以上代码用到Perl的Array,Hash,正则表达式等知识点。请您确保对代码完全理解后使用,有任何问题你可以写信给我。但是我不对由于代码的误用造成的数据丢失负责,请慎用!!!
标签: Perl



0 条评论:
发表评论
指向此帖子的链接: