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
который будет рекурсивно вычислять хэши всех файлов в каталоге, а затем выводить их в файл. Затем его можно использовать в другом каталоге, взяв первый хэш-файл в качестве входных данных и предоставив вам список файлов, которые различаются между двумя каталогами.
Итак, взяв ваш пример, вы должны следовать этому процессу:
Вычислить хеши требуемого каталога на Сервере A:
md5deep -r /opt/foo/ > file_hashes.txt
Скопируйте файл file_hashes.txt
файл на Сервер B для сравнения.
Вычислить хэши требуемого каталога на сервере 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/