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'?
Réponses:
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.
la source
Retirez le
*
. Comme mentionné dans les pages de manuel rsync, l'--delete
option ne fonctionne pas avec les entrées génériques.Utilisez-le à la place:
"--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
dir
oudir/
) sans utiliser de caractère générique pour le contenu du répertoire (par exempledir/*
), 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-excluded
option 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). "la source
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 faitrsync -a --delete $DIR1/b $DIR2
.la source