网站开发日志

2008年10月25日星期六

分享家:Addthis中国

Perl 文件重命名批处理

经过一个多月的努力,终于把公司的新站做好了。前几天我已经把代码从开发服务器拷贝到主服务器上了,只是用了不同的文件名。今天早上8:30开始割接 - 让网站使用新的代码。为了让转换的过程更加迅速,我编写了Perl脚本来代替手动文件备份和重命名。

具体要完成的工作是:

  • 1. 从指定根目录开始搜索新的代码文件,这写新的文件命名规则为:filename_new.tpl, 也就是在实际文件后加了"_new"。
  • 2. 备份原有文件, 命名规则:filename_bak.tpl
  • 3. 把新文件重命名,filename_new.tpl » filename.tpl

因为需要处理的文件分布在不同的路径下面,而且路径也分好几级,所以我用到了Perl的Find模块。具体代码如下:

#!perl -w
use 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 filename
    my $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,正则表达式等知识点。请您确保对代码完全理解后使用,有任何问题你可以写信给我。但是我不对由于代码的误用造成的数据丢失负责,请慎用!!!

标签:

相关文章:

0 条评论:

发表评论

指向此帖子的链接: