CentOS 5.x
Mq вопрос казался похожим на этот, но я не был уверен ...
У меня есть два сервера (полностью изолированных друг от друга), каждый с каталогом и подкаталогами, которые должны иметь одинаковое точное содержимое.
Например, макет каталога может быть примерно таким:
СЕРВЕР А -
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
СЕРВЕР Б -
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
В идеале я хотел бы сделать рекурсивную проверку и получить подтверждение того, что все совпадает.
Я также хочу избегать использования любых сторонних инструментов.
Любые идеи?
rsync
? Так ... хм, использоватьrsync
(с-n
опцией)?Ответы:
Один хороший способ - использовать md5sums для каждого файла в дереве:
Запустите это на server1:
Запустите это на server2
Затем просто сравните два файла (используя diff) или что угодно.
Это то, что вы ищете?
Конечно, вы можете использовать SSH для удаленного выполнения команды, если хотите.
источник
ssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Если вам не обязательно заботиться о том , что изменилось, просто что-то изменилось, rsync все еще действительно хорош для этого. Попробуйте выполнить эту команду и внимательно посмотреть на вывод, предполагая, что он запускается из «servera».
Результирующий список будет теми файлами, которые были бы изменены, если бы вы фактически запустили процесс синхронизации. Помните, что файлы будут отображаться в списке, даже если изменилась только временная метка, но содержимое осталось прежним. Поскольку мы добавили
-n
флаг, то никакие действия фактически не будут выполняться, только сообщается.источник
rsync
. Тем не менее, чтобы быть полностью правильным, вам нужно запуститьrsync
в обоих направлениях. То есть нужно добавить это:rsync -avcn serverb:/opt/foo/ /opt/foo
Несмотря на то, что вы могли бы собрать вместе быстрый скрипт, который будет вычислять отдельные хеши 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, каждый из которых предоставляет альтернативный алгоритм хеширования:
источник
Я использовал технику, похожую на @ scott-pack. Это скажет вам, что вы можете использовать двухстороннее расхождение. Все, что начинается с «удаления» - это файл, который находится на удаленном сервере, но не на локальном сервере. Каждый каталог, в котором нет содержимого файла, не содержит изменений. Каждый файл в списке - это файл, который либо не существует на удаленном сервере, либо локальная версия «новее».
источник