rsync ne supprimera pas les fichiers sur la destination

22

J'essaie de mettre en miroir un répertoire qui change au fil du temps vers un autre répertoire. Mon problème est que rsync ne supprime plus les fichiers à destination s'ils n'existent plus dans le répertoire source. Voici un script de démonstration:

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

Voici la sortie:

+ 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

Comme vous pouvez le voir, le fichier "a" est toujours présent dans le répertoire de destination après la deuxième exécution de rsync, ce qui n'est pas ce dont j'ai besoin. Suis-je en train d'utiliser abusivement l'option '--delete'?

halp
la source
Attention à / * à la fin des répertoires sources. Cela amènera rsync à ne considérer que ces fichiers plutôt que le répertoire lui-même (et l'absence de fichiers qui n'existent plus).
Walt Stoneburner

Réponses:

9

La raison en est que vous appelez rsync sur / tmp / 1 / b, qui ne considérera pas du tout le fichier / tmp / 1 / a.

Votre intention semble être de rsync le répertoire / tmp / 1 / - si vous utilisez "/ tmp / 1 /" comme source plutôt que les fichiers individuels, il remarquera que "a" a été supprimé du répertoire et supprimé à partir de la cible.

Eric
la source
23

Retirez le *. Comme mentionné dans les pages de manuel rsync, l' --deleteoption ne fonctionne pas avec les entrées génériques.

Utilisez-le à la place:

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

"--delete Ceci indique à rsync de supprimer les fichiers superflus du côté réception (ceux qui ne sont pas du côté envoi), mais uniquement pour les répertoires qui sont synchronisés. Vous devez avoir demandé à rsync d'envoyer le répertoire entier (par exemple dirou dir/) sans utiliser de caractère générique pour le contenu du répertoire (par exemple dir/*), car le caractère générique est développé par le shell et rsync reçoit donc une demande de transfert de fichiers individuels, pas le répertoire parent des fichiers. Les fichiers qui sont exclus du transfert sont également exclus de supprimé sauf si vous utilisez l' --delete-excludedoption ou marquez les règles comme correspondant uniquement du côté de l'envoi (voir les modificateurs d'inclusion / exclusion dans la section RÈGLES DE FILTRE). "

Sameer
la source
Ceci est fonctionnellement le même que la réponse de Sven de 2011.
Rowan Hawkins
8

Si vous changez la deuxième ligne rsync en rsync -a --delete $DIR1/ $DIR2(sans *), cela fonctionnera. La raison en est que le shell étend le *aux noms de fichiers dans le premier répertoire, qui n'est que b dans votre cas, donc le fichier manquant a ne sera pas du tout pris en compte par rsync, car la commande qui est exécutée est en fait rsync -a --delete $DIR1/b $DIR2.

Sven
la source