9

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

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

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

Спасибо!

4 ответа4

6

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

5

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

4

К сожалению, на момент написания статьи в 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/

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

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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .