сравнить содержимое двух каталогов на удаленном сервере с помощью unix

Я новичок в unix и мне нужна помощь здесь. У меня есть два каталога на двух разных серверах. оба каталога содержат одни и те же файлы. Теперь я хочу проверить, все ли файлы синхронизированы в обоих каталогах. Если файлы не синхронизированы, я хочу отображать только имя этих файлов. Я могу это сделать, когда каталоги находятся на одном сервере. не могу понять, как это сделать, когда каталоги присутствуют на двух разных серверах.

eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/

здесь я хочу, чтобы отображалось только имя файла, когда оно не синхронизировано.

заранее спасибо


person DSD    schedule 16.10.2013    source источник
comment
Смонтируйте два сервера в общей системе и сравните, как обычно.   -  person devnull    schedule 16.10.2013
comment
мы не можем добиться этого с помощью diff, rsync или vimdiff   -  person DSD    schedule 16.10.2013


Ответы (4)


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

Например, с server1:

rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/

Это напечатает имена всех файлов (рекурсивно, с флагом -r), которые различаются между server1:/abc/home/sample1/ и server2:/abc/home/sample2/.

rsync объяснение используемых параметров

-n, --dry-run - выполнить пробный запуск без внесения изменений

-a, --archive - режим архива; равно -rlptgoD (без -H,-A,-X)

-v, --verbose - увеличить детализацию

-r, --recursive - рекурсия по каталогам

-c, --checksum – пропускать по контрольной сумме, а не по времени и размеру модификации

person kielni    schedule 16.10.2013
comment
Отличный ответ. -c здесь очень важен, так как он сравнивается конкретно по контрольной сумме. Я получал ложные срабатывания без него. -a подразумевает -r (если вы не используете --files-from) - person isuldor; 23.04.2014
comment
Просто чтобы подвести итог. Вы хотите rsync -avcn folder1/ folder2/. - person mniess; 29.07.2014
comment
Обратная косая черта в конце имени папки очень важна. Отсутствие обратной косой черты приведет к тому, что rsync напечатает имена всех файлов. - person czxttkl; 07.07.2016
comment
Мне пришлось поискать это, но полезно отметить, что -n — это просто сокращение от --dry-run. - person user424174; 01.09.2017
comment
Краткий обзор используемых флагов rsync: -n Пробный запуск (фактически не передавать файлы, очень важно) - -a Режим архива (сохранять символические ссылки, разрешения, временные метки...) - -v Подробный вывод - -r Рекурсивный - -c Вместо этого сравнивать с использованием контрольной суммы отметка времени + размер файла. Это важно, чтобы избежать ложных срабатываний, поскольку два местоположения могут не иметь совпадающих временных меток. - person LS97; 06.01.2018

На сервере1:

cd /abc/home/sample1/ && diff --side-by-side --suppress-common-lines <(find . -type f|xargs stat --printf "%s\t%n\n"|sort -n) <(ssh server2 "cd /abc/home/sample2/ && find . -type f|xargs stat --printf \"%s\t%n\n\"|sort -n")

Это довольно быстро, но, вероятно, не так точно, как rsync, поскольку он использует размер файла вместо хэша содержимого. Кроме того, rsync из ответа kielni ничего не покажет, если на server2 больше файлов, чем на server1. Вместо этого попробуйте следующее:

rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/
person AXE Labs    schedule 19.06.2014
comment
Ваша команда rsync должна быть принятым ответом, поскольку она единственная, которая работает. - person Jeroen Wiert Pluimers; 20.04.2015
comment
--delete требуется, чтобы показать, существует ли файл на сервере 2, но не на сервере 1, принятый ответ не показывает, что - person tsukimi; 13.02.2018

Я всегда использую rsync -avcn для таких задач — я фанат CLI. Идея состоит в том, чтобы сделать «пробный прогон» (-n), который показывает, что было бы сделано без фактического копирования каких-либо файлов или внесения каких-либо изменений. Использование переключателя -c действительно важно, так как он использует контрольную сумму, а не дату модификации или размер файла, чтобы определить, отличаются ли файлы. -a обеспечивает более тщательное сравнение и заставляет программу погрузиться в подкаталоги. Наконец, -v увеличивает уровень детализации, что полезно в случае обнаружения разных файлов.

Таким образом, возможное решение выглядит примерно так:

rsync -avcn source_dir/ dest_dir/

и rsync напечатает имена файлов, которые различаются между двумя каталогами. Обратите внимание на косые черты в конце — они необходимы.

Однако:

  1. если имеется много разных файлов, список вскоре заполнит экран терминала и станет трудным для чтения. В этом случае лучше перенаправить вывод в файл: rsync -avcn source_dir/ dest_dir/ > diffs.txt
  2. это может звучать глупо, но не забывайте избегать пробелов, если они есть в исходном или целевом каталоге. Кроме того, вы можете заключить их в кавычки. rsync -avcn /src/My Dir/ dest/My dir/ это не то, что вам нужно; скорее, вы должны использовать rsync -avcn /src/My\ Dir/ dest/My\ Dir/ или, возможно, rsync -avcn /src/"My Dir"/ dest/"My Dir"/. Этот момент особенно актуален при работе с монтированием Windows.
person data.dude    schedule 13.03.2019

В случае отсутствия связи между двумя серверами используйте команду «дерево», чтобы получить структуру каталогов в файлах, а затем сравнить два файла.

person gopuvp    schedule 18.05.2016