Возможно, вы захотите попробовать ol ' File :: Find . Это не мой любимый модуль. (Это просто забавно в том, как это работает), но для ваших целей он позволяет вам легко найти все файлы в двух каталогах и сравнить их. Вот краткий пример:
use strict;
use warnings;
use feature qw(say);
use Digest::MD5::File qw(file_md5_hex);
use File::Find;
use constant {
DIR_1 => "/usr/foo",
DIR_2 => "/usr/bar",
};
my %dir_1;
my %dir_2;
find ( sub {
if ( -f $File::Find::name ) {
$dir_1{$File::Find::name} = file_md5_hex($File::Find::name);
}
else {
$dir_1($file::Find::name} = "DIRECTORY!";
}
}, DIR_1);
find ( sub {
if ( -f $File::Find::name ) {
$dir_2{$File::Find::name} = file_md5_hex($File::Find::name);
}
else {
$dir_2($file::Find::name} = "DIRECTORY!";
}
}, DIR_2);
Это создаст два хэша с ключами в именах файлов в каждом каталоге. Я использовал Digest :: MD5 :: File для создания контрольной суммы MD5. Если контрольная сумма между двумя файлами различается, я знаю, что файлы различаются (хотя я не знаю, где).
Теперь вам нужно сделать три вещи:
- Просмотрите
%dir_1
и посмотрите, есть ли эквивалентный ключ в %dir_2
. Если нет эквивалентного ключа, вы знаете, что файл существует в %dir_1
, а не %dir_2
.
- Если в каждом хэше есть эквивалентный ключ, проверьте, совпадают ли контрольные суммы md5. Если это так, то файлы совпадают. Если они этого не делают, они отличаются. Вы не можете сказать, где они отличаются, но они отличаются.
- Наконец, пройдите
%dir_2
и проверьте, есть ли эквивалентный ключ в %dir_1
. Если есть, ничего не делать. Если нет, это означает, что в %dir_1
есть файл, которого нет в %dir_2
.
Просто предупреждение: ключи этих двух хэшей не будут совпадать . Вам придется преобразовывать одно в другое при выполнении сравнения. Например, у вас будет два файла:
/usr/bar/my/file/is/here.txt
/usr/foo/my/file/is/here.txt
Как видите, my/file/is/here.txt
существуют в обоих каталогах, но в моем коде два хэша будут иметь два разных ключа. Вы можете либо исправить две подпрограммы, чтобы убрать имя каталога из передней части путей к файлам, либо, когда вы проводите сравнение, преобразовать одну в другую. Я не хотел проходить полный тест. (Часть кода, которую я написал, работает в моем тестировании), поэтому я не уверен на 100%, что вам нужно сделать, чтобы убедиться, что вы нашли подходящие ключи.
О, еще одно предупреждение: я беру все записи, а не только файлы. Для каталогов я могу проверить, равен ли ключ хеша DIRECTORY!
или нет. Я мог бы просто игнорировать все, что не является файлом.
И вы можете проверить наличие особых случаев. Это ссылка? Это жесткая ссылка или мягкая ссылка? Как насчет специального файла . Это делает вещи немного сложнее. Тем не менее, основы здесь.