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

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

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

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

 rsync -vrn / dest:/ > ~/file_list

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

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

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

Для создания патча:

rsync -arv --only-write-batch=patch old/ new/

Для его применения:

rsync -arv --read-diff=patch dir/

или используйте автоматически сгенерированный скрипт:

./patch.sh

Источники:

rsync не может сделать это изначально, но если есть возможность использовать унисон из этого вы можете создать формат стиля diff.

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

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

Я верю, что это изначально возможно с Унисон хотя.

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

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

#!/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')

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