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

как сравнить два каталога, находящихся на двух разных серверах

У меня есть одно требование, например ... Мне нужно написать сценарий оболочки, который будет сравнивать два каталога, находящихся на двух разных серверах (сервер A и сервер B), и перечислять расхождения, если они обнаруживаются. В идеале имена файлов, количество и размер должны быть одинаковыми для каталога на двух серверах. Таким образом, сценарий должен обнаруживать неточности, если таковые имеются. Может ли кто-нибудь мне помочь? Заранее спасибо и с наилучшими пожеланиями, Прасенджит

Мне нравится использовать для этой цели rsync.

Например, на ServerA запустите:

rsync -avnc --delete /path/to/dir/ serverB:/path/to/dir/

Вы можете удалить -c переключитесь, если вам не нужно сравнивать контрольные суммы файлов. Без него rsync будет считать, что они одинаковы, если у них одинаковый размер и временные метки.

Обратите внимание на завершающие косые черты на каждом пути.

Очень важно: Убедитесь, что у вас есть -n переключатель, иначе rsync начнет изменять содержимое ServerB

Один из простых способов сделать это в Linux - это:

  1. Использовать find или ls чтобы вывести список всех файлов в каждом каталоге и передать результаты в разные файлы журналов. С помощью ls было бы лучше для ваших целей, так как он может отображать различную информацию, включая разрешения, даты и размеры.
  2. Сравните файлы журнала, используя что-то вроде diff выявить любые различия.

Надеюсь, это поможет вам начать работу.

Предлагаю дерево:

ssh ServerA "tree -s -f <directory>" > /tmp/out1 && ssh ServerB "tree -s -f <directory>" > /tmp/out2 && diff /tmp/out1 /tmp/out2

find может дать вам более точный контроль над тем, что вы сравниваете, позволяя печатать только ту информацию, которая вам нужна. Если, например, вы хотите сравнить файлы по их именам и размерам, но не по их датам или информации о владельце / группе, вы можете сделать:

find . -printf "%p\t%s\n"

find поддерживает множество типов файловой информации. Вот лишь некоторые из них:

%g     File’s group name, or numeric group ID if the  group  has
       no name.
%G     File’s numeric group ID.
%m     File’s  permission bits (in octal).
%M     File’s permissions (in symbolic form, as for  ls).
%n     Number of hard links to file.
%t     File’s  last  modification time in the format returned by
       the C ‘ctime’ function.

Возможно, самым простым было бы, если бы вы могли смонтировать два каталога таким образом, чтобы вы могли сделать что-то вроде:

diff <(cd dir1; find . -printf "%p\t%s\n"|sort) <(cd dir2; find . -printf "%p\t%s\n"|sort)