使用perl清理电脑上的重复文件

发布时间:2020-10-18编辑:脚本学堂
电脑上有超过300G的文件,想清理一下,此时就想到了无所不能的perl了。

电脑上有超过300G的文件,想清理一下,此时就想到了无所不能的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:oldperlgetDataElefromASN.1Copy (3) of getElementChain.pl'
]
},
'rand.pl' => {
'Paths' => [
'D:oldperladvancedperlClosurerand.pl'
]
},
'Get All ATS Core Faults.pl' => {
'Paths' => [
'D:oldperlCoding eReview add FunctionbannerCoding eReview add FunctionbannerGet All ATS Core Faults.pl',
'D:oldperlGet All ATS Core Faults.pl'
]
},