Me gustaría usar rsync para ...
- eliminar archivos en el lado receptor que también se eliminaron en el lado emisor
- no elimine otros archivos que están en el directorio rsynced en el lado receptor
Por ejemplo, digamos que tengo un directorio local-src
:
ANTES: local-src
localmente contiene ...
a.txt
b.txt
c.txt
mi directorio remoto que me gustaría sincronizar con el contenido de local-src
se llama remote-src
.
ANTES: remote-src
remotamente contiene ...
a.txt
b.txt
c.txt
d.txt
README.md
Digamos que elimino algunos archivos en local-src
:
DESPUÉS DE BORRAR LOCAL: local-src
localmente contiene ...
c.txt
¿Cómo puedo usar rsync para asegurarme de que los archivos eliminados en el origen también se eliminen en el destino, pero sin eliminar otros archivos en el destino? Por ejemplo, me gustaría tener lo siguiente en el destino:
DESPUÉS DE BORRAR LOCAL: de remote-src
forma remota contiene ...
c.txt
d.txt
README.md
Es decir, a.txt
y b.txt
se eliminan de forma remota, así, pero d.txt
y README.txt
se quedan solos.
¿Hay alguna forma de lograr esto con rsync?
EDITAR: El veredicto parece ser que esto podría ser imposible con rsync. Me han preguntado por qué necesito esto, así que para ilustrar mi caso de uso:
Digamos que tengo un servidor web. En ese servidor web, tengo un montón de directorios, digamos que tengo un directorio A
y un public_html
directorio desde el que se sirve mi sitio. Digamos que tengo un proceso automatizado que produce archivos en el directorio A
. Me gustaría sincronizar (o sincronizar usando alguna otra herramienta) los archivos generados o actualizados en A
el public_html
directorio, sin eliminar otros archivos arbitrarios que puedan estar dentro public_html
. Ciertamente no quiero que rsync elimine accidentalmente mi sitio web.
Si rsync no es la herramienta para este trabajo, ¿alguien más sabe cómo puedo hacer esto?
rsync
ya que no hay forma de saber qué archivos ya están en la carpeta remota. Es posible que necesite encontrar otra herramienta.Respuestas:
Lo que quiere hacer es razonable, pero usarlo
rsync
para hacerlo solo no lo es. Entonces la respuesta es no .La razón es simple:
rsync
no mantiene un historial de lo que había en cada directorio y no tiene forma de saber qué se debe eliminar y qué no. No sin soporte adicional.Debes preguntarte por qué te gusta hacer esto
rsync
y dejarlo más claro. Hay otros programas que usanlibrsync1.so
que son más inteligentes.Con las restricciones relajadas que no necesita
rsync
per se, puede echar un vistazo a rdiff-backup :Esto muestra
xx
yyy
están enb
.Esto muestra
xx
yzz
están enb
.rdiff-backup
También mantiene un directoriordiff-backup-data
enb
lo que puede deshacer cualquier cambio, debe purgar esto sobre una base regular usando losrdiff-backup
comandos. (El ejemplo es con archivos locales para mostrar que los datos adicionales en el destino no se eliminan, pero rdiff-backup también funciona en una red).Otra alternativa es configurar algún sistema de control de revisión distribuido (mercurial, bazar, git). Con mercurial, por ejemplo, puede tener un script (utilizo un Makefile para eso), que empuja todos los cambios al servidor y luego actualiza los archivos extraídos allí, ignora cualquier archivo adicional que esté en el servidor remoto (pero que tenga no ha sido puesto bajo control de revisión).
En el servidor harías:
En el cliente:
Ahora, si elimina un archivo en el cliente y hace:
Su archivo eliminado se elimina en el servidor, pero cualquier otro dato (no agregado al repositorio) no se elimina.
fuente
A
, donde algunos procesos están automatizados y los archivos se generan automáticamente allí. Tengo un servidor web, y me gustaría que los archivosA
que contengan se envíen alpublic_html
directorio del servidor web, por supuesto, sin eliminar todo lo demás en lapublic_html
carpeta del servidor web. Si alguien tiene alguna idea para lograr esto con otra herramienta, sería más que bienvenido. Actualizaré mi pregunta para reflejar esto.local-src
directorio sin tener algún proceso mirando cambios en ese directorio? Quizás esto sería difícil.rsync
no es la herramienta. Por favor, darse cuenta de quesync
enrsync
proviene de sincronización y que no es exactamente lo que quiere hacer. En el desarrollo delrsync
enfoque se ha centrado en la transferencia eficiente (minimización) de datos. Otras herramientas comordiff-backup
(y posiblescvsup
) han utilizado sus técnicas para eso, pero se basan en él con características adicionales.No creo que esto sea posible sin excluir explícitamente los archivos en el lado receptor como parte del comando rsync. Consulte la sección de la página de manual para rsync: "REGLAS Y BORRADO POR DIRECTORIO".
fuente
Si entendí correctamente,
--exclude
podría ser lo que estás buscando:fuente
Tengo una respuesta para eso. Creo que funciona Y funciona para mi . Primero deberías tener
rsync
archivos remotos a archivos locales. Entonces el lado local contiene todos los archivos.ahora en el lado local
Luego puede eliminar los archivos o hacer lo que quiera (en el lado local). En su pregunta, elimina estos archivos.
archivos borrados
Después de eso, puede
rsync
colocar archivos locales en el lado remoto. Luego, ambos lados tienen los mismos archivos.da
archivos en el lado remoto y en el lado local. (Al usar
--delete
, elimina otros archivos en el lado remoto que no coinciden con el lado local ).fuente