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'?
Respuestas:
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.
fuente
Eliminar el
*
. Como se menciona en las páginas de manual de rsync, la--delete
opción no funciona con entradas comodín.Use esto en su lugar:
"--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.
dir
odir/
) sin usar un comodín para el contenido del directorio (pdir/*
. 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-excluded
opció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) ".fuente
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 realmentersync -a --delete $DIR1/b $DIR2
.fuente