Python实例31[批量对目录下文件重命名]

时间:2021-11-10 13:24:37

 

经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名:
例如:

修改前:[大家网]Mac OS X for Unix Geeks[www.TopSage.com].mobi
修改后:Mac OS X for Unix Geeks.mobi

 
python代码如下

import os
import re

def rename_dir(dir,regex,f):
   if  not os.path.isdir(dir)  or  not os.path.exists(dir) : 
     print( " The input is not one directory or not exist. ")
   for root,subdirs,files  in os.walk(dir):
     for name  in files:
      oldname = name          
      newname = re.sub(regex,f,name)
       print( " Before :  " + os.path.join(root,oldname))
       print( " After  :   " + os.path.join(root,newname))
       if  not name == newname  and  not os.path.exists(os.path.join(root,newname)):
        os.rename(os.path.join(root,oldname),os.path.join(root,newname))
     for dir  in subdirs:
        rename_dir(os.path.join(root,dir))

rename_dir( " C:\\Python31\\test ", " \[.*\](.*)\[www.TopSage.com\](.*) ", lambda m:m.group(1)+m.group(2))

 

用perl写了下,感觉代码也没有少写多少

use strict;
use warnings;
use File::Find;

my  $regex =  " \\[.*\\](.*)\\[www.TopSage.com\\](.*) ";
#  $replace doesn't work
my  $replace =  " \$1\$2 ";

sub wanted {
  my  $name =  $File::Find::name;
  if( -f  $name){
    my  $newname = $name;
    $newname =~ s/ $regex/$ 1$ 2/;
    print  " Before: $File::Find::name\n ";
    print  " After : $newname\n ";
    if( !-e  $newname) {
      rename( $name$newname);
   }
 }
}

sub rename_dir{
   my ( $dir,) =  @_;
   if (!-d  $dir || !-e  $dir){
     print " The input is not directory or not exist. ";
  }
  find(\&wanted,  $dir);
}
&rename_dir( " c:\\perl\\test " );  


perl 实现2

use strict;
use warnings;

my  $regex =  " \\[.*\\](.*)\\[www.TopSage.com\\](.*) ";
#  $replace doesn't work
my  $replace =  " \$1\$2 ";

sub rename_dir{
     my  $dir =  shift;
     if (!-d  $dir || !-e  $dir){
       print " The input is not directory or not exist. ";
    }
     opendir(DIR,  $dir) ||  die  " Cannot opendir $dir. ";
     foreach ( readdir(DIR)) {
       if ( $_ eq  ' . ' ||  $_ eq  ' .. ') { next;}
       my  $name =  $dir. ' / '. $_;
       if(-d  $name){ 
        rename_dir( $name);         
         next;
        }
       my  $newname = $_;
       $newname =~ s/ $regex/$ 1$ 2/;
       $newname =  $dir. ' / '. $newname;
       print  " Before : $name\n ";
       print  " After  : $newname\n ";
       rename( $name, $newname);
    }
     # closedir(DIR);
}
&rename_dir( " c:\\perl\\test " );  

完!