rsync copiando el contenido del directorio de forma no recursiva

8

Estoy tratando de copiar el contenido de una serie de directorios de forma no recursiva a otro sistema remoto.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 y dir3 contienen muchos directorios que no quiero copiar. Copie en el host remoto a / dirB manteniendo la misma estructura de directorios.

Lo intenté:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Pero no hacen lo que quiero.

Felipe Alvarez
fuente

Respuestas:

20

rsync le permite especificar patrones que desencadenan la inclusión o exclusión de archivos y directorios. Creo que quieres usar algo como esto:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Explicación:

  • -aactiva el modo de archivo que activa tanto la recursión como la preservación de "enlaces simbólicos, dispositivos, atributos, permisos, propiedades, etc.", según man rsync.
  • -fes la abreviatura de --filter=, que agrega una regla de filtrado de archivos.
    • El patrón está dentro de comillas simples para que el shell no expanda comodines; las comillas dobles funcionarían igualmente bien en este caso.
    • - significa que este es un patrón de exclusión.
    • El /inicio significa que el patrón debe comenzar en dirA/(la rsync "transfer-root").
    • La */*parte del patrón se refiere a cualquier cosa dentro de un subdirectorio.
    • El final /limita la exclusión a los directorios. Los archivos dentro de un subdirectorio de dirA/no se ven afectados.

Entonces, al final, rsync copia nada más que un nivel hacia abajo (y tampoco crea directorios de segundo nivel).

Por favor levantese
fuente
2
¡Muy agradable! Pude usar -f '- /*/'para restringir solo a archivos de nivel superior. También tuve que especificar -f '- .*'para excluir archivos de puntos, ya que estaba sincronizando un directorio de inicio.
haridsv
5

La solución anterior (por PleaseStand) no funcionó para mí por alguna razón. Sin embargo, esto funcionó:

rsync -avc --no-r ./source/* ./destination/

También hay esta alternativa:

rsync -avc --exclude "/" ./source/ ./destination/

Andrei Pokrovsky
fuente
1

Una de las "características" de rsync es cómo se analizan los directorios.

rsync /dirA/ host:/dirB/ y rsync /dirA host:/dirB debería ser teóricamente equivalente.

Como no quieres alentar la recursividad, debes evitar -r, lo -aque además de otras cosas implica -r.

Todavía no he terminado con la investigación, pero esta es mi respuesta inicial.

asesino
fuente