rsync non cancellerà i file sulla destinazione


22

Sto cercando di eseguire il mirroring di una directory che cambia nel tempo in un'altra directory. Il mio problema è che rsync non sta eliminando i file sulla destinazione se non esistono più nella directory di origine. Ecco uno script demo:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

Ecco l'output:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

Come puoi vedere, il file "a" è ancora presente nella directory di destinazione dopo che rsync viene eseguito per la seconda volta, che non è quello di cui ho bisogno. Sto abusando dell'opzione '--delete'?


Fai attenzione a / * alla fine delle directory dei sorgenti. Ciò farà sì che rsync consideri solo quei file anziché la directory stessa (e l'assenza di file che non esistono più).
Walt Stoneburner,

Risposte:


9

Il motivo è perché stai chiamando rsync su / tmp / 1 / b, che non considererà affatto il file / tmp / 1 / a.

La tua intenzione sembra essere quella di risincronizzare la directory / tmp / 1 / - se usi "/ tmp / 1 /" come sorgente anziché i singoli file, noterà che "a" è stato cancellato dalla directory e rimuovi dal bersaglio.


23

Rimuovi il *. Come menzionato nelle pagine man di rsync, l' --deleteopzione non funziona con le voci jolly.

Usa questo invece:

rsync -a --delete $DIR1/ $DIR2/

"--Delete Questo dice rsync per eliminare i file estranei dal lato ricevente (quelli che non sono sul lato di invio), ma solo per le directory che vengono sincronizzati. Dovete avere chiesto rsync per inviare l'intera directory (ad esempio, diro dir/) senza utilizzare un carattere jolly per il contenuto della directory (ad es. dir/*) poiché il carattere jolly viene espanso dalla shell e rsync riceve quindi una richiesta di trasferimento di singoli file, non della directory principale dei file . Anche i file esclusi dal trasferimento vengono esclusi dall'essere eliminato a meno che tu non usi l' --delete-excludedopzione o contrassegni le regole come corrispondenti solo sul lato di invio (vedi i modificatori di inclusione / esclusione nella sezione REGOLE DI FILTRO). "


Funzionalmente è la stessa della risposta di Sven del 2011.
Rowan Hawkins,

8

Se cambi la seconda riga rsync in rsync -a --delete $DIR1/ $DIR2(senza il *) funzionerà. Il motivo è che la shell espande i *nomi dei file nella prima directory, che è solo b nel tuo caso, quindi il file mancante a non verrà considerato affatto da rsync, poiché il comando che viene eseguito è effettivamente rsync -a --delete $DIR1/b $DIR2.

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.