Comando rsync para hacer una copia de seguridad de los archivos en el directorio principal y ciertos directorios con eliminación

Comando rsync para hacer una copia de seguridad de los archivos en el directorio principal y ciertos directorios con eliminación

Intento preparar el comando rsync que: 1. hará una copia de seguridad de todos los archivos en el directorio pero no de los archivos anidados 2. hará una copia de seguridad de ciertos directorios 3. eliminará los archivos en el directorio de destino cuando se eliminen en el origen

rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/

Pero esto solo copia archivos y no copia ninguna carpeta ni elimina. ¿Podrías ayudarme a mejorar el comando?

Respuesta1

Estrictamente hablando, los siguientes pueden interpretarse como objetivos contradictorios.

  1. hacer una copia de seguridad de todos los archivos en el directoriopero no archivos anidadoses decir --exclude='*/'
  2. hacer una copia de seguridad de ciertos directorios, es decir, incluir algunos archivos anidados

Consulte a continuación una explicación de por qué sus argumentos no funcionaron como esperaba. Más abajo, vea una alternativa adecuada que podría adaptarse a su propósito (satisface los puntos 1, 3 y una versión del n.° 2).

Por qué su comando no funcionó:

De la forma en que rsync procesa los argumentos de su línea de comandos, los siguientes argumentos equivalen a decir --exclude='*/'

--excluir='/' --include='subcarpeta_desirada/'

es decir, su comando excluyó todos los archivos anidados, excluyendo así también los archivos en las subcarpetas deseadas.

Este problema afecta su segunda observación, es decir, que los archivos en el destino que se eliminan en el origen no se eliminan. En realidad, su comando funciona perfectamente para eliminar dichos archivos en el nivel superior. Sin embargo, los archivos de un nivel inferior no se eliminan porque ya están excluidos. Es útil recordar que --delete se refiere a --delete-durante, no a --delete-antes.

Soluciones que satisfacen los puntos 1, 3 y la versión del 2: La siguiente solución podría satisfacer sus necesidades.

rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/

Cumple lo siguiente: 1. Realiza una copia de seguridad de todos los archivos y directorios en profundidad 1, pero no de los archivos anidados. 2. Haga una copia de seguridad de las carpetas deseadas. 3. Elimina archivos en el destino que no están en el origen.

Otra opción más engorrosa es la siguiente.

  rsync -vlptgoDd --delete src/ dest/

Esto satisface los puntos 1 y 3, pero evita todos los archivos anidados (recuerde que las carpetas también son archivos en *nix). Evité dar la opción -r, por lo que no es recursiva. Se copian las obras eliminadas y las carpetas en la profundidad 1. Además de conservar las marcas de tiempo (-t), incluí otras opciones típicas para la copia de archivos.

Una forma más estándar de obtener diferentes comportamientos de rsync en diferentes carpetas es distribuir reglas de filtro por directorio a través de la jerarquía; es decir, cree archivos .rsync-filter específicos para cada carpeta que exija un comportamiento único. Por ejemplo

   rsync -avF src/ dest/

información relacionada