Solicitar a rsync que elimine archivos en el lado receptor que no existen en el lado emisor, con excepciones en el lado receptor

29

He leído estos hilos:

Pero, por lo que puedo decir (tal vez me estoy perdiendo algo), no cubren la siguiente pregunta:

¿Cómo solicita rsynccopiar archivos y eliminar aquellos en el lado receptor que no existen en el lado emisor, con excepciones? (por ejemplo, no elimine un repositorio mercurial .hgen el lado receptor, incluso si no hay un repositorio en el lado emisor).

¿Una posibilidad?

Tomando prestado de la respuesta de @Richard Holloway a continuación. Digamos que tengo la siguiente línea:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Por lo que yo entiendo, esta línea haría rsynceliminar todo en la ruta de recepción que no existe en la ruta de envío, excepto aquellas cosas que coinciden dont_delete_me. Mi pregunta ahora es: ¿rsync mantendría los archivos en el lado receptor que coinciden dont_delete_me incluso si nada en el lado emisor coincide dont_delete_me?

Amelio Vazquez-Reina
fuente

Respuestas:

33

Si usa --deletey --excludejuntos lo que está en la ubicación excluida no se eliminará, incluso si se eliminan los archivos de origen.

Pero eso plantea el problema de que la carpeta no será rsyncen absoluto. Entonces necesitará otro rsynctrabajo para syncesa carpeta.

P.ej.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Puede ejecutarlos al revés, pero luego eliminaría todos los archivos eliminados y luego los reemplazaría, lo que no es tan eficiente.

No puedes hacerlo como un trazador de líneas.

Richard Holloway
fuente
Gracias @ Richard. Su respuesta me hace pensar que mi pregunta original puede haber sido más fácil de lo que pensaba. Si uso la línea única: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path¿no rsynceliminaría todo en la ruta de recepción que no existe en la ruta de envío, excepto las cosas que coinciden dont_delete_me? Lo más importante, ¿ rsyncmantendría las cosas en el lado receptor igualadas dont_delete_me incluso si nada en el lado emisor coincidedont_delete_me ? Si ese es el caso, creo que esa es la única línea que necesito, ¿verdad?
Amelio Vazquez-Reina
Está en lo correcto, pero tampoco obtendrá nuevos archivos y cambios en la carpeta dont_delete_me si lo hace en una línea. Si no desea sincronizar los cambios y las adiciones, puede usar el indicador --excluir como se describe aquí.
Richard Holloway
@AmV Los archivos excluidos no se eliminan --delete, a menos que especifique explícitamente --delete-excluded. Consulte la descripción de --deletey --delete-excludeden el manual de rsync.
Gilles 'SO- deja de ser malvado'
4

Descubrí que la siguiente solución funciona para mis propósitos:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Nota: ¡Agregue la -nopción de hacer una ejecución en seco y no cambie --deletea --delete-excluded!)

La ejecución del comando provoca las siguientes propiedades:

  • El srcdirectorio fuente permanece sin modificaciones.
  • La destcarpeta de destino coincide con la carpeta de origen, excepto que:

    • los elementos de la do_not_send_to_destlista no se envían al destino y
    • los elementos de la do_not_modify_in_destlista no se modifican en el destino.
  • (Nota: no es un problema que los elementos inexistentes se enumeren en cualquiera de los " do_not_" archivos).

Explicación

Supongo que cuando rsync lee los argumentos de la línea de comandos de izquierda a derecha, el --deleteargumento parece hacer que rsync "cambie de modo" internamente (en cierto sentido), permitiendo el segundo uso de la --exclude-fromopción nuevamente pero con un significado diferente.

Advertencia:

  • Si do_not_send_to_destya existe un elemento en la lista en el destino, entonces:

    • este comando no elimina ese elemento del destino (a menos que el elemento se elimine primero del directorio de origen)
    • Precaución: si cambia --deletea --delete-excluded, eliminará todo el destino que figura en cualquiera de sus dos listas. xD (¿Quizás rsync fue escrito para ser abierto / flexible, pero tiene algunos con matices?)

Ligeramente probado en uso.

Estoy usando " rsync version 3.0.9 protocol version 30".

usuario2533809
fuente