заставьте rsync дождаться подтверждения, прежде чем вносить изменения в файлы

11

Я делаю синхронизацию между локальной и удаленной папкой. Случилось так, что я потерял один файл по глупой команде.

Я привык унисон и то, как вы подтверждаете ("идти?"), Прежде чем делать фактическую передачу файлов.

Есть ли такая опция с rsync? (нет унисон на стороне сервера)

Спасибо!

meduz
источник

Ответы:

3

Вместо официальной опции «--confirm» можно использовать собственный «пакетный режим» rsync для обхода необходимости дважды вычислять разницу между двумя путями. Пакетный режим был предназначен для распределения изменений в зеркалах (вычисление один раз, обновление множества идентичных деревьев). Создаются два файла: командный файл, содержащий обновления, и простой вспомогательный скрипт для запуска обновления (в конце справочной страницы rsync есть подробное описание).

Вот оболочка bash для абстрагирования процесса:

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

Стив
источник
1
Требуется ли подтверждение для каждого файла?
Сильно нерегулярный
2
Нет, это вычисляет изменения, отображает их, а затем отображает одно приглашение «Продолжить (да / нет)?» Прошло некоторое время с тех пор, как я использовал это, но IIRC, rsync все еще, казалось, пересчитывал rdiff.
Стив
7

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

Майк Фитцпатрик
источник
7

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

ZB»
источник
5

К сожалению, на момент написания статьи в Rsync нет встроенного метода.

Решение Майка Фитцпатрика будет работать нормально, однако, если у вас очень большое дерево каталогов, вы можете захотеть сделать что-то, что не заставит rsync снова просмотреть все файлы

РЕДАКТИРОВАТЬ: Существует также ошибка, при которой он не удаляет файл назначения ... чем больше и больше я смотрю на него, это решение не работает ... Я оставляю его, потому что оно может работать в вашем случае, а также, если кто-то хочет Исправить это. Кроме того, кто-то должен отправить официальный запрос на функцию 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/

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

Дэйв Батлер
источник