shoorick: (Default)
shoorick ([personal profile] shoorick) wrote2006-08-06 01:36 pm

Поиск одинакового

Две недели назад сляпал на коленке скрипт:
#!/usr/bin/perl -w
use strict;

use File::Find;
use Digest::file qw(digest_file_hex);

# Переменные
my %hash;   # Хеш списков файлов

print STDERR "Scanning...\n";

# Рекурсивно ищем файлы
find(\&wanted, '.');

print STDERR "\r", ' 'x78, "\rfinished", "\n";

# Выводим результат
print "Same files:\n";
foreach (keys %hash)    {
    my @list = @{$hash{$_}};
    print '=' x 50, "\n", join("\n", @list), "\n" if $#list > 0;
} # foreach

#############################

# И в каждом из них выполняем
sub wanted {
    if (-f) {
        push(@{$hash{digest_file_hex($_, "MD5")}}, $File::Find::name);
        print STDERR "\r", ' 'x78, "\r", $File::Find::name;
    } # if
} # sub
Ищет одинаковые (по содержимому) файлы в текущем каталоге и рекурсивно вглубь, после чего выводит список найденных в STDOUT. Дёшево и сердито. [Не]совпадение имён и размеров файлов роли не играет.

[identity profile] victorgr.livejournal.com 2006-08-06 04:42 pm (UTC)(link)
Скрипт - это хорошо :).
А вот есть ещё программа fdupes - finds duplicate files in a given set of directories.

fdupes

[identity profile] shoorick.livejournal.com 2006-08-07 04:36 am (UTC)(link)
А у меня дома Windows. И без Cygwin...

На работе

[identity profile] shoorick.livejournal.com 2007-04-04 05:04 am (UTC)(link)
А на работе - и Windows, и FreeBSD (я сейчас под ней живу). Сейчас попробую fdupes. Спасибо за наводку!

[identity profile] much-more.livejournal.com 2006-08-07 10:27 am (UTC)(link)
Есть проги, заточенные под поиск похожих картинок. Т.е. им по барабану идентичность файлов.
Я пользовал Image Dupeless & Dup Detector, какая-то из них мне даже нравилась :)

[identity profile] ypq.livejournal.com 2006-08-17 08:53 am (UTC)(link)
дайджест - это хорошо, только нет смысла сравнивать два дайджеста, если размеры файлов отличаются. :)
т.е. я бы для скорости сначала нашел файлы с одинаковой длиной, а уж потом сравнивал их MD5.
впрочем, где-то у меня тоже валялся такой скриптик, правда на ruby.