rsync no eliminará archivos en el destino

22

Estoy tratando de reflejar un directorio que cambia con el tiempo a otro directorio. Mi problema es que rsync no está eliminando archivos en el destino si ya no existen en el directorio de origen. Aquí hay un script de demostración:

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

Aquí está la salida:

+ 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

Como puede ver, el archivo "a" todavía está presente en el directorio de destino después de que rsync se ejecuta por segunda vez, que no es lo que necesito. ¿Estoy haciendo mal uso de la opción '--delete'?

halp
fuente
Tenga cuidado con / * al final de los directorios de origen. Eso hará que rsync solo considere esos archivos en lugar del directorio en sí (y la ausencia de archivos que ya no existen).
Walt Stoneburner

Respuestas:

9

La razón es porque está llamando a rsync en / tmp / 1 / b, que no considerará el archivo / tmp / 1 / a en absoluto.

Parece que su intención es sincronizar el directorio / tmp / 1 / - si usa "/ tmp / 1 /" como fuente en lugar de los archivos individuales, notará que "a" se ha eliminado del directorio y eliminará desde el objetivo.

Eric
fuente
23

Eliminar el *. Como se menciona en las páginas de manual de rsync, la --deleteopción no funciona con entradas comodín.

Use esto en su lugar:

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

"--delete Esto le dice a rsync que elimine archivos extraños del lado receptor (los que no están en el lado de envío), pero solo para los directorios que se están sincronizando. Debe haberle pedido a rsync que envíe todo el directorio (p. ej. diro dir/) sin usar un comodín para el contenido del directorio (p dir/*. ej. ), ya que el comodín se expande por el shell y rsync recibe una solicitud para transferir archivos individuales, no el directorio principal de los archivos. Los archivos que se excluyen de la transferencia también se excluyen de eliminado a menos que use la --delete-excludedopción o marque las reglas como solo coincidentes en el lado emisor (consulte los modificadores de inclusión / exclusión en la sección REGLAS DEL FILTRO) ".

Sameer
fuente
Esto es funcionalmente lo mismo que la respuesta de Sven de 2011.
Rowan Hawkins
8

Si cambia la segunda línea rsync a rsync -a --delete $DIR1/ $DIR2(sin *) funcionará. La razón es que el shell expande los *nombres de archivo en el primer directorio, que es solo b en su caso, por lo que rsync no considerará en absoluto el archivo faltante a, ya que el comando que se ejecuta es realmente rsync -a --delete $DIR1/b $DIR2.

Sven
fuente