perl清理电脑上重复的文件
2011-03-15 18:34
218 查看
苦于电脑上的东西太多(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'
]
},
用.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'
]
},
相关文章推荐
- 使用perl清理电脑上重复文件实现代码(续)
- perl清理电脑上重复的文件--续
- 【lizhi125】FindDupFile - 轻松查找与清理电脑上的重复文件、照片的绿色软件
- Tidy Up 5 Mac激活版(重复文件查找和磁盘清理工具) v5.0.2最新破解版
- perl脚本去除文件中重复数据
- 超薄笔记本电脑回收站里面的文件清理了怎么找回
- 最近在清理重复文件的时候发现一个MD5值计算工具
- 如何自己编写程序文件清理电脑垃圾
- 清理删除电脑中的垃圾临时文件的方法有哪些
- 清理电脑垃圾的七个BAT文件
- 关于清理电脑系统垃圾的batch文件
- 教你一招:30秒清理你电脑所有文件!让速度快如轮转!
- qq垃圾文件清理教程,给电脑腾空间
- 去除文件中重复行,保序perl代码。
- perl删除文件中的重复行
- 清理电脑中的垃圾文件
- 用PYTHON实现将电脑里的所有文件按大小排序,便于清理
- 在windows操作系统中使用批处理文件清理电脑的垃圾
- 自制30秒清理电脑所有垃圾文件的DOS工具的详细方法和程序命
- [教训] windows 电脑的垃圾文件清理...