La opción Rsync --delete no elimina archivos de puntos ocultos en el objetivo

La opción Rsync --delete no elimina archivos de puntos ocultos en el objetivo

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 rmque nunca dijiste rsyncque te importara src/.test1en absoluto. De man 1 rsync[énfasis mío]:

--delete
Esto indica rsyncque 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 solicitado rsyncenviar el directorio completo (por ejemplo, diro dir/) sin utilizar un comodín para el contenido del directorio (por ejemplo dir/*,)ya que el shell expande el comodín y, rsyncpor 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-errorsresolvió el problema.

Más detalles: Uso de cygwin para copiar desde un servidor Linux a una unidad USB de Windows.

El origen es server:/srcy 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

información relacionada