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-srcse 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.txty b.txtse eliminan de forma remota, así, pero d.txty README.txtse 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 Ay un public_htmldirectorio 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 Ael public_htmldirectorio, 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?

rsyncya 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
rsyncpara hacerlo solo no lo es. Entonces la respuesta es no .La razón es simple:
rsyncno 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
rsyncy dejarlo más claro. Hay otros programas que usanlibrsync1.soque son más inteligentes.Con las restricciones relajadas que no necesita
rsyncper se, puede echar un vistazo a rdiff-backup :Esto muestra
xxyyyestán enb.Esto muestra
xxyzzestán enb.rdiff-backupTambién mantiene un directoriordiff-backup-dataenblo que puede deshacer cualquier cambio, debe purgar esto sobre una base regular usando losrdiff-backupcomandos. (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 archivosAque contengan se envíen alpublic_htmldirectorio del servidor web, por supuesto, sin eliminar todo lo demás en lapublic_htmlcarpeta 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-srcdirectorio sin tener algún proceso mirando cambios en ese directorio? Quizás esto sería difícil.rsyncno es la herramienta. Por favor, darse cuenta de quesyncenrsyncproviene de sincronización y que no es exactamente lo que quiere hacer. En el desarrollo delrsyncenfoque 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,
--excludepodría ser lo que estás buscando:fuente
Tengo una respuesta para eso. Creo que funciona Y funciona para mi . Primero deberías tener
rsyncarchivos 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
rsynccolocar 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