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


10

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

Я звик унісон і до того, як ви підтверджуєте ("йдете?") Перед тим, як зробити фактичну передачу файлів.

Чи є такий варіант з rsync? (без унісон на стороні сервера)

Дякую!

Відповіді:


3

Замість офіційного параметра "- підтвердити", власний "пакетний режим" 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).


1
Це запитує підтвердження для кожного файлу?
сильно нерегулярний

2
Ні, це обчислює зміни, відображає їх, а потім відображає єдине запит "Продовжити (у / н)?" Минуло давно, як я цим користувався, але IIRC, rsync все ще здавалося, що перерахував rdiff.
Стів

6

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


5

На жаль, у 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/

Цей скрипт може бути трохи помилковим, я помітив, що він не дуже йому подобається, якщо у вас немає кінцевої косої риски у вихідному каталозі ...


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.