Назад | Перейти на главную страницу

Как я могу легко подтвердить в Linux, что два отдельных каталога имеют одинаковое содержимое?

CentOS 5.x

Вопрос Mq казался похожим на вот этот но я не был уверен ...

У меня есть два сервера (полностью изолированные друг от друга), каждый с каталогом и подкаталогами, которые должны иметь одинаковое точное содержимое.

Например, макет каталога может быть примерно таким:

СЕРВЕР A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

СЕРВЕР B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

В идеале я хотел бы провести рекурсивную проверку и получить подтверждение, что все совпадает.

Я также хочу избегать использования каких-либо сторонних инструментов.

Любые идеи?

Хороший способ - использовать md5sums для каждого файла в дереве:

Запустите это на server1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Запустите это на server2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Затем просто сравните два файла (используя diff) или что угодно.

Это то, что вы ищете?

Конечно, вы можете использовать SSH для удаленного выполнения команды, если хотите.

Если вам не обязательно заботиться о какие изменилось, просто что-то изменилось, rsync по-прежнему хорош для этого. Попробуйте запустить эту команду и внимательно посмотрите на вывод, предполагая, что он запускается из «сервера».

rsync -avcn /opt/foo/ serverb:/opt/foo

Итоговым списком будут те файлы, которые были бы изменены, если бы вы действительно запустили процесс синхронизации. Помните, что файлы будут отображаться в списке, даже если изменилась только временная метка, но содержимое осталось прежним. Поскольку мы добавили -n flag, то фактически никакие действия выполняться не будут, только сообщается.

Хотя вы можете создать быстрый скрипт, который будет вычислять отдельные хэши MD5 для отдельных файлов в каталоге, лучший способ сделать это - использовать инструмент под названием md5deep который будет рекурсивно вычислять хэши всех файлов в каталоге, а затем выводить их в файл. Затем его можно использовать в другом каталоге, взяв первый хэш-файл в качестве входных данных и предоставив вам список файлов, которые различаются между двумя каталогами.

Итак, взяв ваш пример, вы должны следовать этому процессу:

  1. Вычислить хеши требуемого каталога на Сервере A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Скопируйте файл file_hashes.txt файл на Сервер B для сравнения.

  3. Вычислить хэши требуемого каталога на сервере B, но взяв хэши файлов с сервера A в качестве входного файла, используя -x флаг, чтобы показывать только разные файлы:

    md5deep -x file_hashes.txt -r /opt/foo/

Набор инструментов md5deep является частью системы управления пакетами большинства дистрибутивов, и самое замечательное в том, что он поддерживает ряд различных алгоритмов хеширования, а не только MD5. Так что, если вы параноик по поводу столкновений, у вас есть несколько альтернатив. Следующие инструменты являются частью md5deep, каждый из которых предоставляет альтернативный алгоритм хеширования:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests

Я использовал технику, похожую на @ scott-pack. Это даст вам двухстороннее различие. Все, что начинается с «удаления», - это файл, который находится на удаленном сервере, но не на локальном сервере. Каждый каталог, указанный без какого-либо содержимого файла, не имеет изменений. Каждый указанный в списке файл является файлом, которого либо нет на удаленном сервере, либо его локальная версия «новее».

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/