fai in modo che rsync attenda una conferma prima di cambiare i file


11

Sto eseguendo una sincronizzazione tra una cartella locale e una cartella remota. È successo che ho perso un file con un comando stupido.

Sono abituato all'unisono e al modo in cui confermi ("vai?") Prima di eseguire l'effettivo trasferimento di file.

Esiste tale opzione con rsync? (nessun unisono sul lato server)

Grazie!

Risposte:


3

Al posto di un'opzione "--confirm" ufficiale, la "modalità batch" di rsync può essere sfruttata per evitare di dover calcolare due volte la differenza tra due percorsi. La modalità batch era destinata alla distribuzione delle modifiche ai mirror (calcolare una volta, aggiornare molti alberi identici). Vengono creati due file: un file batch contenente gli aggiornamenti e un semplice script di convenienza per l'esecuzione dell'aggiornamento (c'è una sezione verso la fine della pagina man di rsync con i dettagli).

Ecco un wrapper bash per astrarre il processo:

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

Si noti che, poiché scrive questo script $TMP_DIR, è possibile incorrere in vincoli di spazio se si spostano dati veramente grandi (ad esempio più grandi di / tmp).


1
Questo richiede una conferma per ogni file?
Altamente irregolare,

2
No, questo calcola le modifiche, le visualizza e quindi visualizza un singolo prompt, "Continua (sì / no)?" È passato un po 'di tempo da quando l'ho usato, ma IIRC, rsync sembrava ancora ricalcolare il rdiff.
Steve

7

È possibile utilizzare l'opzione -n ​​con rsync per eseguire una corsa a secco. rsync ti dirà quali operazioni avrebbe eseguito senza effettivamente eseguirle. Se sei soddisfatto dei risultati, riesegui senza l'opzione -n.


7

Puoi eseguire rsync per eseguire il backup dei file in sovrascrittura, utilizzando l'opzione --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)

dopo l'esecuzione di rsync è possibile eseguire la scansione dei file di backup-dir e chiedere uno per uno se è necessario ripristinarli.


5

Purtroppo, al momento non esiste un metodo integrato in Rsync.

La soluzione di Mike Fitzpatrick funzionerà bene, tuttavia se hai un albero di directory molto grande, potresti voler fare qualcosa che non faccia rsync passare di nuovo tutti i file

EDIT: C'è anche un bug in cui non eliminerà un file di destinazione ... più lo guardo sempre più, questa soluzione è rotta ... Lo lascio andare perché potrebbe funzionare nel tuo caso e anche se qualcuno vuole per risolverlo. Inoltre, qualcuno dovrebbe inviare una richiesta formale di funzionalità a https://bugzilla.samba.org/enter_bug.cgi?product=rsync

Ho scritto questo script:

#! /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
  • Prova a incollare lo script in un file chiamato rsync-confirm.bash

  • Poi chmod +x rsync-confirm.bash

  • Poi ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Questo script potrebbe essere un po 'difettoso, ho notato che non gli piace davvero se non hai una barra finale nella directory di origine ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.