zmuś rsync, aby poczekał na potwierdzenie przed faktyczną zmianą plików

11

Synchronizuję folder lokalny i zdalny. Zdarzyło się, że straciłem jeden plik głupim poleceniem.

Jestem przyzwyczajony do unisonowania i sposobu, w jaki potwierdzasz („idź?”) Przed wykonaniem faktycznego transferu plików.

Czy jest taka opcja w rsync? (brak unison po stronie serwera)

Dzięki!

meduz
źródło

Odpowiedzi:

3

Zamiast oficjalnej opcji „--confirm” można wykorzystać własny „tryb wsadowy” rsync, aby ominąć konieczność dwukrotnego obliczenia różnicy między dwiema ścieżkami. Tryb wsadowy był przeznaczony do dystrybucji zmian w serwerach lustrzanych (oblicz raz, zaktualizuj wiele identycznych drzew). Tworzone są dwa pliki: plik wsadowy zawierający aktualizacje i prosty skrypt wygody do uruchomienia aktualizacji (na końcu strony podręcznika rsync znajduje się sekcja ze szczegółami).

Oto opakowanie bash do streszczenia procesu:

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

Zauważ, że skoro ten skrypt pisze $TMP_DIR, możesz napotkać ograniczenia przestrzeni, jeśli przenosisz naprawdę duże dane (na przykład większe niż twoje / tmp).

Steve
źródło
1
Czy wymaga to potwierdzenia każdego pliku?
Wysoce nieregularny
2
Nie, to oblicza zmiany, wyświetla je, a następnie wyświetla pojedynczy monit „Kontynuować (t / N)?” Minęło trochę czasu, odkąd użyłem tego, ale IIRC, rsync nadal wydawało się przeliczyć rdiff.
Steve
7

Możesz użyć opcji -n z rsync, aby wykonać próbę na sucho. rsync powie ci, jakie operacje wykonałby bez ich wykonania. Jeśli jesteś zadowolony z wyników, uruchom ponownie bez opcji -n.

Mike Fitzpatrick
źródło
7

Możesz zrobić rsync do tworzenia kopii zapasowych plików podczas zastępowania, używając opcji --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)

po uruchomieniu rsync możesz skanować katalog kopii zapasowej w poszukiwaniu plików i pytać jeden po drugim, czy trzeba go przywrócić.

zb ”
źródło
5

Niestety, podczas pisania w Rsync nie ma wbudowanej metody.

Rozwiązanie Mike Fitzpatrick będzie działać dobrze, jednak jeśli masz bardzo duże drzewo katalogów, możesz chcieć zrobić coś, co nie spowoduje, że rsync przejdzie ponownie przez wszystkie pliki

EDYCJA: Jest też błąd, w którym nie usuwa pliku docelowego ... im więcej patrzę na to, to rozwiązanie jest zepsute ... Zostawiam to, ponieważ może to działać w twoim przypadku, a także, jeśli ktoś chce naprawić to. Ponadto ktoś powinien przesłać formalne żądanie funkcji na https://bugzilla.samba.org/enter_bug.cgi?product=rsync

Napisałem ten skrypt:

#! /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
  • Spróbuj wkleić skrypt do pliku o nazwie rsync-confirm.bash

  • Następnie chmod +x rsync-confirm.bash

  • Następnie ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Ten skrypt może być trochę wadliwy. Zauważyłem, że nie podoba mu się to, jeśli nie masz ukośnika w katalogu źródłowym ...

Dave Butler
źródło