经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名:
例如:
修改前:[大家网]Mac OS X for Unix Geeks[www.TopSage.com].mobi
修改后: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 ", " \[.*\](.*)\[www.TopSage.com\](.*) ", lambda m:m.group(1)+m.group(2))
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 " );
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 " );
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 " );
完!