Intereting Posts
Компилировать флаги и параметры конфигурации – TLS Heartbeat Команда Linux получает идентификатор процесса tomcat по имени Как запустить pip на windows? Что такое «Работа» (дочерняя процедура) в Windows и когда ее использовать? Отправить идентификатор токена на серверную сторону Android Как получить текущее состояние Caps Lock в VB.NET? Win32, несколько компьютеров NIC, разные DNS для сетевого адаптера, как ведет себя gethostbyname? Быстро создать большой файл в системе Windows? Nginx перенаправляет, если присутствует файл cookie Как анализировать / извлекать данные из файлов .nfo Детский процесс Windows Java не вводит и не выводит при установке стандартного ввода-вывода родительского элемента (Command Prompt) Сообщение MQTT не принимается в подписке на подписку Выполнение пакетного файла на удаленном компьютере через PsExec FreeTDS – TSQL терпит неудачу, когда пароль задан в опции, но преуспевает при вводе? Как восстановить из git-svn, поместив в хранилище другой файл dulplicate с обложками?

Сравнить контрольную сумму файлов между двумя серверами и несоответствие отчетов

Мне нужно сравнить контрольную сумму всех файлов в /primary и /secondary папках в machineA с файлами в этой папке /bat/snap/ которые находятся на удаленном сервере machineB . На удаленном сервере будет много файлов вместе с файлами, которые у нас есть в machineA .

  • Если в контрольной сумме есть несоответствие, я хочу сообщить обо всех файлах, которые имеют проблемы в machineA с полным путем и выйти с ненулевым кодом состояния.
  • Если все соответствует, то завершите ноль.

Я написал одну команду (не уверен, есть ли лучший способ ее написать), который я запускаю на machineA но очень медленный. Есть ли способ сделать это быстрее?

 (cd /primary && find . -type f -exec md5sum {} +; cd /secondary && find . -type f -exec md5sum {} +) | ssh machineB '(cd /bat/snap/ && md5sum -c)' 

Также он печатает имя файла, подобное этому ./abc_monthly_1536_proc_7.data: OK . Есть ли способ, с помощью которого он может распечатать полное имя пути этого файла на machineA ?

ssh на удаленный хост для каждого файла определенно не очень эффективен. parallel может ускорить его, сделав это одновременно для большего количества файлов, но более эффективный способ, вероятно, немного изменит команду, чтобы он сделал ssh для machineB и получил все md5sum за один снимок. Возможно ли это сделать?

Если файлы находятся в каталоге /primary и /secondary вместо этих каталогов, потеряйте find.You может также пожелать распараллелить md5-расчет. Так что это сделает:

 #!/bin/bash cd /primary md5sum * > /tmp/file-p & cd /secondary md5sum * > /tmp/file-s & wait cat /tmp/file-p /tmp/file-s | ssh machineB '(cd /bat/snap/ && md5sum -c)' 

С относительно небольшим набором файлов:

 $ time find . -exec md5sum {} \; 7e74a9f865a91c5b56b5cab9709f1f36 ./file 631f01c98ff2016971fb1ea22be3c2cf ./hosts d41d8cd98f00b204e9800998ecf8427e ./fortune8547 49d05af711e2d473f12375d720fb0a92 ./vboxdrv-Module.symvers bf4b1d740f7151dea0f42f5e9e2b0c34 ./tmpavG1pB a9b0d3af1b80a46b92dfe1ce56b2e85c ./in.clean.4524 real 0m0.046s user 0m0.035s sys 0m0.006s $ time md5sum * 7e74a9f865a91c5b56b5cab9709f1f36 file d41d8cd98f00b204e9800998ecf8427e fortune8547 631f01c98ff2016971fb1ea22be3c2cf hosts a9b0d3af1b80a46b92dfe1ce56b2e85c in.clean.4524 bf4b1d740f7151dea0f42f5e9e2b0c34 tmpavG1pB 49d05af711e2d473f12375d720fb0a92 vboxdrv-Module.symvers real 0m0.005s user 0m0.003s sys 0m0.002s 

(просто чтобы доказать, что находка не всегда самая быстрая).

Используя md5sum вы можете попросить его проверить файлы на файл ввода md5sum .

man md5sum : полезны следующие два варианта:

  • -c, --check : читать MD5 суммы из ФАЙЛОВ и проверять их
  • --quiet : не печатать OK для каждого успешно подтвержденного файла

Итак, все, что нам нужно сделать, это построить такой файл и передать его. Самым простым является следующее (от machineA ):

 $ cd /primary; md5sum * | ssh machineB '(cd /bat/snap; md5sum -c - --quiet 2>/dev/null)` $ cd /secondary; md5sum * | ssh machineB '(cd /bat/snap; md5sum -c - --quiet 2>/dev/null)` 

Это будет сообщать о таких вещах, как:

 file1: FAILED file2: FAILED open or read 

Это даст вам все неудачные файлы в каталоге. Вы можете выполнить любую последующую обработку с любым вкусом awk .

Если ваша основная цель состоит не в подсчете контрольных сумм, а в различиях в списках, возможно, более быстрый (и более простой) способ – запустить rsync с параметром --dry-run . Если какие-либо файлы перечислены, они отличаются, например:

 MBP:~ jhartman$ rsync -avr --dry-run rsync-test 192.168.1.100:/tmp/; echo $? building file list ... done rsync-test/file1.txt sent 172 bytes received 26 bytes 396.00 bytes/sec total size is 90 speedup is 0.45 

Конечно, из-за --dry-run никаких файлов не было изменено на цель.

Надеюсь, это поможет, Джарек

Вы можете попытаться распараллелить процесс, упомянутый в другом ответе. измените значение + на a \ ;, выполните bash с помощью &.

 find $(pwd) -type f -exec bash -c "md5sum '{}' &" \;