Saturday, March 22, 2014

Perl 을 이용한 중복화일 찾기



중복된 화일을 찾아주는 스크립트
화일 이름은 다르나 내용은 같은 즉, md5 hash 값을 기준으로 동일한
파일을 찾아준다.
이미지나 음악화일, 혹은 동영상 등등 중복된 화일을 찾을 수 있다.
활용한다면 중복 화일을 찾아 지우는것 활용해 볼 수 있다.

===========================================
#!/usr/bin/perl

use strict;
use warnings;
use File::Find;
use Digest::MD5;

#중복화일의 리스트를 담은 배열을 리턴
sub find_dups(@)
{
#인자로 넘겨받은 디렉토리
my @dir_list = @_;
if($#dir_list < 0) {
return (undef);
}

#size로 인덱싱됨.
my %files;

#화일 트리를 돌면서 모든 화일을 찾아 비슷한 사이즈의 화일을 담는다.
find( sub {
-f &&
push @{$files{(stat(_))[7]}}, $File::Find::name
}, @dir_list
);

my @result = ();

#md5 가 같은지
foreach my $size (keys %files) {
if ($#{$files{$size}} < 1) {
next;
}
my %md5; #file name array hash

#loop 돌면서 md5 sum check
foreach my $cur_file (@{$files{$size}}) {
open(FILE, $cur_file) or next;
binmode(FILE);
push @{$md5{
Digest::MD5->new->addfile(*FILE)->hexdigest}
}, $cur_file;
close (FILE);
}

#중복 검사
foreach my $hash (keys %md5){
if ($#{$md5{$hash}} >= 1) {
push(@result, [@{$md5{$hash}}]);
}
}
}
return @result
}

my @dups = find_dups(@ARGV);

foreach my $cur_dup (@dups) {
print "Duplicates\n";
foreach my $cur_file (@$cur_dup) {
print "\t$cur_file\n";
}
}
=============================================




No comments:

Post a Comment