Solution 1 :
Supprimer le *
. Comme mentionné dans les pages de manuel de rsync, le --delete
l'option ne fonctionne pas avec les entrées génériques.
Utilisez ceci à la place :
rsync -a --delete $DIR1/ $DIR2/
"--deleteThis 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 en cours de synchronisation. Vous devez avoir demandé à rsync d'envoyer tout le répertoire ( par exemple dir
ou 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, et non le répertoire parent des fichiers. Les fichiers exclus du transfert sont également exclus de la suppression, sauf si vous utilisez le --delete-excluded
ou marquez les règles comme ne correspondant qu'au côté expéditeur (voir les modificateurs d'inclusion/exclusion dans la section RÈGLES DE FILTRE)."
Solution 2 :
La raison est que vous appelez rsync sur /tmp/1/b, qui ne prendra pas du tout en compte le fichier /tmp/1/a.
Votre intention semble être de rsynchroniser 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 supprimera de la cible.
Solution 3 :
Si vous modifiez la deuxième ligne rsync en rsync -a --delete $DIR1/ $DIR2
(sans le *) cela fonctionnera. La raison 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
.