
Estos son los pasos que tomé:
Crea algunos archivos de prueba:
/tmp $ mkdir src tgt
/tmp $ cd src/
/tmp/src $ touch .test{1,2,3}
/tmp/src $ ls -la
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:02 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
Sincroniza los directorios src y tgt:
/tmp/src $ cd ..
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
3 files to consider
.test1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/3)
.test2
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/3)
.test3
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=0/3)
sent 209 bytes received 86 bytes 590.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
Elimine un archivo en src y sincronice nuevamente:
/tmp $ rm -rf src/.test1
/tmp $ ls -la src/
total 0
drwxr-xr-x 4 user wheel 136 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
2 files to consider
sent 75 bytes received 20 bytes 190.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
El archivo .test1 no se eliminó en el directorio tgt.
¿Por qué la opción --delete no funciona en este caso?
¿Cómo obtengo el comando rsync para eliminar archivos ocultos en el destino?
Respuesta1
Esto no tiene nada que ver con archivos ocultos. Después de rm
que nunca dijiste rsync
que te importara src/.test1
en absoluto. De man 1 rsync
[énfasis mío]:
--delete
Esto indicarsync
que se eliminen archivos extraños del lado receptor (los que no están en el lado emisor), perosólo para los directorios que se están sincronizando. Debe haber solicitadorsync
enviar el directorio completo (por ejemplo,dir
odir/
) sin utilizar un comodín para el contenido del directorio (por ejemplodir/*
,)ya que el shell expande el comodín y,rsync
por lo tanto, recibe una solicitud para transferir archivos individuales, no el directorio principal de los archivos. […]
Sincronizar directorios, no archivos individuales:
rsync -avh --delete --progress src/ tgt
Respuesta2
El truco consiste en sincronizar directorios (como lo menciona @Kamil Maciorowski), pero también usamos los filtros de inclusión y exclusión para que solo se sincronicen los archivos de puntos en primer lugar:
rsync -avh --delete --progress --include '.*' --exclude '*' src/tgt
Respuesta3
En mi caso, agregar --ignore-errors
resolvió el problema.
Más detalles: Uso de cygwin para copiar desde un servidor Linux a una unidad USB de Windows.
El origen es server:/src
y el destino es /cygdrive/e
.
Quedaba un archivo oculto de una ejecución anterior de rsync. El nombre del archivo era algo así como.data.qpSS6L
Ejecutar el siguiente comando hizonoeliminar el archivo:
rsync -rvvth --update server:/src /cygdrive/e --delete
Lo siguiente agrega --ignore-errors y elimina el archivo oculto correctamente:
rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors