zoukankan      html  css  js  c++  java
  • perl清理电脑上重复的文件

    苦于电脑上的东西太多(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'
    ]
    }
    ,
  • 相关阅读:
    saolei
    Hibernate中表与表之间的关联多对多,级联保存,级联删除
    Hibernate中表与表之间的关联一对多,级联保存和级联删除
    Hibernate中的Query对象查询所有记录
    Hibernate缓存
    hibernate简单实现连接数据库,并实现数据的操作
    Navicat注册码
    用jdbc连接数据库并简单执行SQL语句
    JDBC中的DriverManager.getConnection(url)中的参数url
    spring进行事务管理
  • 原文地址:https://www.cnblogs.com/hurner/p/1985158.html
Copyright © 2011-2022 走看看