在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
苦于电脑上的东西太多(300多G的空间,还有移动硬盘,电脑和硬盘上的东西很多重复了),一直想清理一下,这种活技术含量不高,体力系数却高得惊人,肯定不能人去干了,得想编程。 用.net吧,不够我折腾的,有点小题大作了。 以前用Perl搜索文件的程序,很快很好很简洁,就选他了,不过不小心还是走了点弯路。
开始的构思,就先把所有的遍历出来,再对这个东西进行挨个比对: 先遍历:
$dw->onFile(
sub { my ($file) =@_; push@files, { "Name"=>basename($file), "Dir"=>dirname($file), "FullName"=>$file }; return File::DirWalk::SUCCESS; } ); $dw->walk('D:/old/perl');
再在尝试循环比对一下,如果只有两个重复文件的话,好说一点,但如果出现多个重复文件,就可能要用标记或者多次推出列表了,想着更麻烦了。
my$cmp_sub=sub
{ $_[0]{"Name"} cmp $_[1]{"Name"} }; #先排序 my@Newfiles=sort {$cmp_sub->($a,$b)} @files; while(@Newfiles) { print $#Newfiles."\n"; my$item=pop@Newfiles; my$idx= custom_list_search($cmp_sub,$item,\@Newfiles); if($idx!=-1) { print$item->{"FullName"}."\n"; print$Newfiles[$idx]{"FullName"}."\n"; } print"\n"; }
更麻烦了,总是有种感觉这个问题用perl的数据结构应该是很好解决的,我肯定走岔了。灵光一闪,用HASH不是一个就搞定了吗,用FileNAME作Key,用一个路径数组用VALUE,不就行了吗:)如下:
my%files;
$dw->onFile( sub { my ($file) =@_; push @{$files{basename($file)}->{"Paths"}},$file;
#Paths这里是一个路径数组,看见路径就往里塞,自动塞到同一个文件名下的路径列表中去.
return File::DirWalk::SUCCESS; } ); my$hTrace; open$hTrace,'> Trace.txt'; select$hTrace; $dw->walk('D:/old/perl'); print Dumper(\%files); close$hTrace;
OK, 搞定,所有的活就在那一句push,全搞定。 最终出来的HASH数据体如下:一个文件在哪里出现多次一止了然,剩下的工作就很好说了:) 说PERL是巫师,真没说错!!! $VAR1= {
'getElementChain.pl'=> { 'Paths'=> [ 'D:\\old\\perl\\getDataElefromASN.1\\Copy (3) of getElementChain.pl' ] }, 'rand.pl'=> { 'Paths'=> [ 'D:\\old\\perl\\advancedperl\\Closure\\rand.pl' ] }, 'Get All ATS Core Faults.pl'=> { 'Paths'=> [ 'D:\\old\\perl\\Coding eReview add Functionbanner\\Coding eReview add Functionbanner\\Get All ATS Core Faults.pl', 'D:\\old\\perl\\Get All ATS Core Faults.pl' ] }, |
请发表评论