苦於電腦上的東西太多(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'
]
},