perl文件名过滤工具
有时候客户给的文件文件名里面有很多空格,在网页解析的时候会把这些空格变成只保留一个,所以得去掉这些空格。通过重命名是一种方法。这里我是对文件名进行批量过滤。
1 #!/usr/bin/perl -w 2 use strict; 3 use warnings; 4 use File::Find (); 5 use File::Basename ; 6 7 #文件名过滤工具(批量改文件名,去掉文件名中的全部/或多余空格) 8 #暂不支持目录重命名 9 use vars qw/*name *dir *prune/ ; 10 *name = *File::Find::name ; 11 *dir = *File::Find::dir ; 12 *prune = *File::Find::prune ; 13 14 our $space = 0 ; #默认留1个空格,$space = 0 时去除所有空格 15 16 #回调函数 17 sub wanted 18 { 19 if( /\.jpg/s ) 20 { 21 my @file_array = split /\n/, $name ; 22 foreach my $file ( @file_array ) 23 { 24 my ($nameName,$path,$suffix) = fileparse($file,".jpg"); 25 print "name:$nameName$suffix\t path:$path\n" 26 } 27 } 28 } 29 30 sub renamer; 31 sub folderTraverse 32 { 33 my $dir = shift ; 34 #File::Find::find({wanted=>\&renamer},$dir); 35 File::Find::find({wanted=>\&singleFile_renamer},$dir); 36 } 37 sub renamer 38 { 39 my @file_array = split /\n/, $name ; 40 my %dir_array ;#为了判断元素是否重复,用hash表 41 #先对文件进行重命名 42 foreach my $file ( @file_array ) 43 { 44 my ($fileName,$path,$suffix) = fileparse($file,".jpg"); 45 46 $dir_array{$path} = 1 if(!exists( $dir_array{$path} )) ; 47 48 my $newFile = $fileName ; 49 ( $space ) ? ( $newFile =~ s#\s{2,}# #g ) : ( $newFile =~ s#\s{2,}##g ) ; 50 if( -e $newFile ){} 51 else{ 52 if( rename $file => $newFile ){} 53 else{warn "rename $file error!";} 54 } 55 } 56 #再对目录进行重命名 !!!!!!!这涉及到一个递归的问题!如果上一级目录先重名于下一级,这样就没法找到下一级目录! 57 foreach my $dir ( %dir_array ) 58 { 59 my $newDir = $dir =~ s#\s{2,}# #gr ; 60 rename $dir => $newDir ; 61 } 62 } 63 64 sub singleFile_renamer 65 { 66 my @file_array = split /\n/, $name ; 67 foreach my $file ( @file_array ) 68 { 69 my ($fileName,$path,$suffix) = fileparse($file,".jpg"); 70 71 my $newFile = $fileName ; 72 ( $space ) ? ( $newFile =~ s#\s{2,}# #g ) : ( $newFile =~ s#\s+##g ) ; 73 if( -e $path.$newFile.$suffix ){} 74 else{ 75 if( rename $file => $path.$newFile.$suffix ){ 76 print "替换文件:$fileName 为 $newFile \n"; 77 } 78 else{warn "rename $file error!";} 79 } 80 } 81 } 82 83 84 sub main 85 { 86 my $dir = 'C:\Users\Administrator\Desktop\products' ; 87 folderTraverse($dir); 88 } 89 main();