У меня есть одно требование, например ... Мне нужно написать сценарий оболочки, который будет сравнивать два каталога, находящихся на двух разных серверах (сервер A и сервер B), и перечислять расхождения, если они обнаруживаются. В идеале имена файлов, количество и размер должны быть одинаковыми для каталога на двух серверах. Таким образом, сценарий должен обнаруживать неточности, если таковые имеются. Может ли кто-нибудь мне помочь? Заранее спасибо и с наилучшими пожеланиями, Прасенджит
Мне нравится использовать для этой цели rsync.
Например, на ServerA запустите:
rsync -avnc --delete /path/to/dir/ serverB:/path/to/dir/
Вы можете удалить -c
переключитесь, если вам не нужно сравнивать контрольные суммы файлов. Без него rsync будет считать, что они одинаковы, если у них одинаковый размер и временные метки.
Обратите внимание на завершающие косые черты на каждом пути.
Очень важно: Убедитесь, что у вас есть -n
переключатель, иначе rsync начнет изменять содержимое ServerB
Один из простых способов сделать это в Linux - это:
find
или ls
чтобы вывести список всех файлов в каждом каталоге и передать результаты в разные файлы журналов. С помощью ls
было бы лучше для ваших целей, так как он может отображать различную информацию, включая разрешения, даты и размеры.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)