¿Eliminar archivos extraños del directorio de destino a través de rsync?

51

Di que tengo

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

No elimina hello.jpg de DEST, ¿alguna idea de cómo archivar esto?

Cheng
fuente

Respuestas:

72

La razón por la cual su comando no funciona se explica en la página del manual para rsync (énfasis agregado):

--Eliminar

Esto le dice a rsync que elimine los archivos extraños del lado receptor (los que no están en el lado emisor), pero solo para los directorios que se están sincronizando. Debe haberle pedido a rsync que envíe todo el directorio (por ejemplo, "dir" o "dir /") sin usar un comodín para el contenido del directorio (por ejemplo, "dir / *") ya que el comodín expande el comodín y rsync obtiene un 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 ser eliminados a menos que use la opción --delete-excluded o marque las reglas como solo coincidentes en el lado de envío (consulte los modificadores de inclusión / exclusión en la sección REGLAS DE FILTRO).

Por lo tanto, cuando corres

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

los archivos no deseados en DEST no se eliminan porque en realidad no ha pedido que se sincronice un directorio, sino solo un puñado de archivos específicos. Para obtener los resultados que desea, intente algo como esto:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Tenga en cuenta que el orden de las directivas de inclusión y exclusión es importante. Esencialmente, cada archivo se compara con los patrones de inclusión o exclusión en el orden en que aparecen. Por lo tanto, los archivos con extensiones .jpg o .txt se sincronizan ya que coinciden con los patrones "incluidos" antes de que coincidan con el patrón "*" excluido. Todo lo demás está excluido por el --exclude '*'patrón. La --delete-excludedopción garantiza que incluso los archivos excluidos en el lado DEST se eliminen.

Steven D
fuente
@ Cheng, ¿te gustaría explicar un poco más? Estaré encantado de actualizar mi respuesta si hay un problema / mejora.
Steven D
Funciona. Supongo. Las cosas del proceso me confunden, me hacen pensar que fue transferido nuevamente.
Cheng
He editado mi respuesta para explicar un poco más.
Steven D
2
@ Cheng: sospecho que no quieres el --delete-excluded. Sin ella, solo *.jpgy *.txtse puede eliminar en el lado de destino. Con él, los archivos no relacionados también se eliminarían. Puede interesarle este tutorial sobre filtros rsync .
Gilles 'SO- deja de ser malvado'
3
¡Gracias! Para mí, me faltaba la barra diagonal final en el directorio de origen.
Vaughan