9404803 发表于 2015-4-25 10:35:55

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

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


修改前:[大家网]Mac OS X for Unix Geeks.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","\[.*\](.*)\(.*)",lambda m:m.group(1)+m.group(2))  
  用perl写了下,感觉代码也没有少写多少

use strict;
use warnings;
use File::Find;
my $regex = "\\[.*\\](.*)\\(.*)";
# $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 = "\\[.*\\](.*)\\(.*)";
# $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");

  完!
页: [1]
查看完整版本: Python实例31[批量对目录下文件重命名]