Відповіді:
Замість офіційного параметра "- підтвердити", власний "пакетний режим" rsync може бути використаний для обходу, маючи вдвічі обчислити різницю між двома шляхами. Пакетний режим призначений для розповсюдження змін у дзеркалах (обчислити один раз, оновити багато однакових дерев). Створюються два файли: пакетний файл, що містить оновлення та простий скрипт зручності для запуску оновлення (є кінець на кінці сторінки man rsync з деталями).
Ось баш-обгортка для абстрагування процесу:
#!/bin/bash
cleanup ()
{
rm ${BFILE} ${BFILE}.sh &>/dev/null
}
# generate tmpfile
BFILE=$( mktemp )
# rsync command
if ! rsync --only-write-batch="${BFILE}" --verbose "$@"; then
cleanup
exit 1
fi
# confirmation
read -p "Continue (y/N)? " confirm
if [ "$confirm" != "y" ]; then
echo "Aborting"
cleanup
exit 1
fi
# carve up arguments
dest="${@: -1}" # last argument
host="${dest%%:*}" # host:path
path="${dest#*:}"
opts="${@:1:$(($#-2))}" # everything but the last two args
if [ "$host" = "${path}" ]; then
# local
sh "${BFILE}.sh"
else
# remote
ssh "$host" rsync --read-batch=- "${opts}" "${path}" <"${BFILE}"
fi
cleanup
Зауважте, що оскільки цей сценарій пише $TMP_DIR
, ви можете зіткнутися з обмеженнями у просторі, якщо ви переміщуєте дійсно великі дані (наприклад, більше, ніж ваш / tmp).
Ви можете використовувати опцію -n з rsync для виконання сухого прогону. rsync розповість вам, які операції він би виконував, фактично не виконуючи їх. Якщо ви задоволені результатами, повторіть роботу без опції -n.
На жаль, у Rsync в цей час не існує вбудованого методу.
Рішення Майка Фіцпатріка буде добре працювати, проте якщо у вас дуже велике дерево каталогів, ви можете зробити щось, що не змушує rsync переглядати всі файли знову
EDIT: Також є помилка, коли вона не видаляє файл призначення ... чим більше я дивлюся на це, це рішення порушується ... Я залишаю його, тому що він може працювати у вашому випадку, а також, якщо хтось хоче щоб виправити це. Також хтось повинен надіслати офіційний запит на функцію https://bugzilla.samba.org/enter_bug.cgi?product=rsync
Я написав цей сценарій:
#! /bin/bash
# Make a temp file for storing the output of rsync
tmpfile=$( mktemp ) &&
# Do all the hard work ( get the list of files we need to update ),
# but dont actually change the filesystem
rsync --dry-run --out-format='RSYNC_CONFIRM %i %n%L' "$@" | grep RSYNC_CONFIRM | awk '{ print $3 }' > $tmpfile &&
# Output to the user what we propose to do
rsync --dry-run --itemize-changes --files-from=$tmpfile "$@" &&
# Alternatively, we could just output $tmpfile... but whatever...
read -p "Continue? (y/n)?" &&
if [[ $REPLY = [yY] ]]
then
{
rsync --files-from=$tmpfile "$@"
}
fi
rm $tmpfile
Спробуйте вставити скрипт у файл, який називається rsync-confirm.bash
Потім chmod +x rsync-confirm.bash
Потім ./rsync-confirm.bash -rvh /etc/ /tmp/etc/
Цей скрипт може бути трохи помилковим, я помітив, що він не дуже йому подобається, якщо у вас немає кінцевої косої риски у вихідному каталозі ...
Ви можете зробити rsync для резервного копіювання файлів при перезаписі, використовуючи опцію --backup,
-b, --backup make backups (see --suffix & --backup-dir)
--backup-dir=DIR make backups into hierarchy based in DIR
--suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
після запуску rsync ви можете сканувати файл резервного копіювання файлів і запитувати один за одним, чи потрібно його відновити.