Я копирую много файлов, которые были изменены с одного сервера на другой, используя 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 для создания двоичного сравнения, но я не думаю, что он будет полезен для того, что вы описываете, он обычно используется для реализации инкрементного резервного копирования.