有没有在一个目录十几万个文件里面搜索所有相同的文件方法 (已找到很多解决方案)

新手涉及到的教学或入门贴,推荐新手必看,版主维护
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#31

帖子 eexpress » 2007-11-09 16:47

这害人的妹托,一直不说明是什么文件。
● 鸣学
头像
xiehuoli
帖子: 5941
注册时间: 2006-06-10 8:43
来自: 中国 CS

#32

帖子 xiehuoli » 2007-11-09 16:49

eexpress 写了:这害人的妹托,一直不说明是什么文件。
呵呵,什么文件都有
叫我怎么说
年轻没有失败! ! ! ! ! !
噢!有怪兽,有怪兽!
头像
paulcross
帖子: 484
注册时间: 2006-07-23 20:27

#33

帖子 paulcross » 2008-03-17 10:06

文件名是写在文件里的么 文件改名后大小会不会变化
whale
帖子: 16
注册时间: 2008-02-17 14:27

#34

帖子 whale » 2008-03-22 22:37

sourceforge.net上有一个项目叫Duplicate Finder,能够满足楼主的要求。
根据我使用的经验,它在查找时分2步
step 1:扫描所有文件,把相同大小的文件归成一组
step 2:在每组文件之间,按node进行比较,而不是计算md5,估计是出于效率

没有仔细看源程序,应该是这个思路
lz感兴趣的话可以仔细阅读source,这就是GPL的最大好处!一切尽在掌握!不必重复发明车轮!
spectator
帖子: 178
注册时间: 2007-10-20 20:15

#35

帖子 spectator » 2008-03-23 10:56

难道是豆腐MM那天叫我试的BT脚本??

$ cat dup_find.pl

代码: 全选

#!/usr/bin/perl 
#===============================================================================
#
#        USAGE:  ./dup_dete.pl [dir1] [dir2]
#
#  DESCRIPTION:  Duplcate file detector
#
#       AUTHOR:  DawnFantasy (DF), <goldenshore999 ATAT gmail DOTDOT com>
#      VERSION:  1.0
#     REVISION:  1 
#===============================================================================

use strict;
use warnings;
use utf8;
binmode STDOUT, 'utf8';

use File::Find;
use Digest::SHA;

#use File::stat qw(:FIELDS);
use IO qw/ Dir File /;
use Data::Dumper;

sub usage {
    print <<EOU;
Usage:
    $0 [dir [dir]]
EOU
}
usage(), exit -1 if not @ARGV;

my %hashes;
my @result;
{
    no warnings;
    foreach my $dir (@ARGV) {
        print "Loading file info in DIR $dir\n";
        find( { wanted => \&get_info, no_chdir => 1 }, ($dir) );
    }

    ## 过滤只对应一个文件
    my %process = map { @{ $hashes{$_} } > 1 ? ( $_, $hashes{$_} ) : () }
        keys %hashes;

    ##print "Progress:\n";
    ##print Dumper \%process;
    my $max = int ( scalar ( keys %process ) / 100 ) + 1;
    my $count;
    my $percent = 0;
    ## print "Groups: $max\n";
    ## 每个大小都看一次
    foreach ( sort { $a * 1 <=> $b * 1 } sort keys %process ) {
        $count++;
        if ( $count == $max ) {
            $percent++;
            $count = 0;
            ##print '  ', $percent, "%\r";
        }
        my @files = @{ $process{$_} };
        ##print "FILES: @files\n";
        my %digests = map { $_, get_digest($_) } @files;
        ##print Dumper \%digests;

        my %rev_d = reverse (%digests);
        ##print Dumper \%rev_d;
        ## 每个digest
        foreach my $d ( sort keys %rev_d ) {
            my @files = grep { $digests{$_} eq $d } sort keys %digests;
            next if @files < 2;
            ##print Dumper \@files;
            push @result, [@files];
            print "SAME: @files\n";
        }
    }
    ##print "100%\n";

    {
        last;
        foreach (@result) {
            my @files = @$_;
            ##print "SAME: @files\n";
        }
    }
}

sub get_digest {
    my $fn = shift;
    my $sha = Digest::SHA->new(1);
    $sha->addfile($fn);
    my $digest = $sha->hexdigest;

    return $digest;
    ##print "$fn $inode $size \n";
}

sub get_info {
    my $fn = $File::Find::name;
    ## file / readable / not symlink
    return 1 if not -f $fn;
    return 1 if not -r $fn;
    return 1 if -l $fn;

    my ( $inode, $size ) = ( stat ($fn) )[ 1, 7 ];
    return 1 if $size == 0;
    return 1 if $size == 1;
    return 1 if $size > 16 * 1024 * 1024; ## 16MB
    ##$hashes{$fn} = { inode => $inode, size => $size };
    if ( defined $hashes{$size} ) {
        my @s = @{ $hashes{$size} };
        push @s, $fn;
        $hashes{$size} = [@s];
    } else {
        $hashes{$size} = [$fn];
    }

    #my @stats = stat($fn);
    #print Dumper \@stats;
    #print "$fn $stat\n";
    #print " $fn $inode $size\n";
}

代码: 全选

 $ ./dup_find.pl /home/fideas/temp /home/fideas/temp
Loading file info in DIR /home/fideas/temp
Loading file info in DIR /home/fideas/temp
SAME: /home/fideas/temp/.emacs.d/auto-save-list/.saves-5133-localhost~ /home/fideas/temp/.emacs.d/auto-save-list/.saves-5306-localhost~
SAME: /home/fideas/temp/.emacs.d/auto-save-list/.saves-13190-localhost~ /home/fideas/temp/.emacs.d/auto-save-list/.saves-6879-localhost~
SAME: /home/fideas/temp/software/statabooks/statamanual/中æç
                                                             stataå
¥é¨è®²ä¹.pdf /home/fideas/temp/software/statabooks/中æç
                                                        stataå
¥é¨è®²ä¹.pdf
SAME: /home/fideas/temp/software/Introduction to Modern Econometrics Using Stata.djvu /home/fideas/temp/software/statabooks/StatisticWithStata/Introduction to Modern Econometrics Using Stata.djvu
Portage 2.1.4.4 (default-linux/x86/2007.0/desktop, gcc-4.2.3, glibc-2.7-r1,
System uname: 2.6.24-gentoo-r3 i686 Intel(R) Celeron(R) M processor 1.30GHz
头像
lhw828
帖子: 2797
注册时间: 2007-03-15 16:58
来自: 湖北武汉
联系:

#36

帖子 lhw828 » 2008-03-23 22:38

看不懂………………
头像
吴广德
帖子: 347
注册时间: 2006-10-26 9:24
系统: Ubuntu 18.04 LTS
来自: 中国-广西-南宁

#37

帖子 吴广德 » 2008-03-26 9:04

打个Mark,以后会有用的,呵呵
Ubuntu 18.04 LTS使用中......

主板:MSI Z97 gaming 9 ACK
CPU:I7 4790K
内存:DDR3 8G x 4 = 32G
硬盘:60G SSD(/) + 1T HD(/home)
显示器:Philips 274E5Q
头像
yihan189
帖子: 89
注册时间: 2007-10-14 15:47

#38

帖子 yihan189 » 2008-03-27 12:05

高手阿,全是高手,学习了
蝶梦痕
帖子: 34
注册时间: 2007-11-25 16:28

#39

帖子 蝶梦痕 » 2008-08-31 15:15

标记一下,有意思的东西.........
头像
lwent90
帖子: 34
注册时间: 2011-07-30 21:57

Re: 有没有在一个目录十几万个文件里面搜索所有相同的文件方法 (已找到很多解决方案)

#40

帖子 lwent90 » 2011-07-31 9:30

用了版主大大的代码 非常好用
回复