Получить rsync для создания файла исправления вместо копирования между файлами?


19

Я копирую множество файлов, которые изменились с одного сервера на другой, используя rsync. Я знаю, что могу использовать -nопцию, чтобы выполнить пробный прогон, чтобы я мог видеть, какие файлы были изменены. Однако возможно ли заставить rsync распечатать разность содержимого файла, которое изменилось? Я хотел бы увидеть, что происходит, прежде чем делать копию? Что-то, что я могу сохранить в файл и применить с diff (1) позже?

Ответы:


8

Возможно, есть лучший способ, но это может сработать, хотя и не так эффективно:

 rsync -vrn / dest:/ > ~/file_list

Затем отредактируйте тест, чтобы удалить статистику, затем:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Другой вариант:
вы можете также подумать о монтировании файловой системы с помощью чего-то вроде sshfs / fuse, а затем просто использовать diff.


Примечание: я не проверял эти команды ;-)
Кайл Брандт,

Хорошее начало, но есть множество дополнительных выходных данных из rsync, таких как статистика, «отправка списка добавочных файлов» и т. Д.
Rory

Вы можете использовать --out-format = "% f"
Кайл Брандт,

Если вы используете формат out, отбросьте v и grep -v 'пропуская нерегулярный файл' ... Это должно быть довольно чисто
Кайл Брандт,

Просто проверяю, есть ли случайно новый / лучший метод через rsync --diffдва года ...
Кольцо Ø



1

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

Возможно, вы сможете написать его, используя вывод rsync. Но это было бы хакерским.

Я действительно верю, что это возможно с Unison .


1
Это мое, что вы имели в виду под хаком? :-)
Кайл Брандт

Абсолютно, Кайл: D
Дэн Карли

1

Почему бы просто не использовать что-то вроде diff (для текстовых файлов) или xdelta (для двоичных файлов) для генерации diff? Зачем вам нужно что-то конкретно из rsync?


Мне не нужен rsync, но он должен быть удаленным
Рори

О нет, ssh!
womble

1

Чтобы расширить ответ Кайла, это автоматизирует процесс. Обратите внимание, что он полностью не проверен, возможно, довольно хрупок и может удалить ваш компьютер и убить вашу собаку.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')

0

Алгоритм rsync работает путем сравнения двоичных фрагментов файла. Такой бинарный diff не предназначен для печати. Существует команда rdiff, которая использует алгоритм rsync для генерации двоичных различий, но я не думаю, что она будет полезна для того, что вы описываете, она обычно используется для создания инкрементных резервных копий.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.