¿Cómo sincronizar un directorio a un nuevo directorio con un nombre diferente?

49

Estoy haciendo una transferencia de datos, el antiguo sistema de archivos se basa profundamente en un directorio que ahora está en una ruta diferente. Este es un directorio git que almacena el código en línea. No tengo derechos para moverlo o cambiarle el nombre.

Entonces, lo que puedo hacer es rsync este directorio a la misma ruta anterior. Pero el nombre del directorio también cambió.

¿Hay alguna manera fácil de sincronizar un directorio a un directorio de destino con un nombre diferente?

zen
fuente

Respuestas:

83

Si desea utilizar rsyncpara hacer recursivamente el destdirectorio una copia exacta del srcdirectorio:

rsync -a src/ dest

La rsyncpágina del manual explica cómo funciona esto:

Una barra inclinada final en la fuente [...] evita [s] crear un nivel de directorio adicional en el destino. Puede pensar en un final /en una fuente que significa "copiar el contenido de este directorio" en lugar de "copiar el directorio por su nombre" [...]

Adrian
fuente
3
Esto creará un srcdirectorio bajo destdirectorio
Zen
77
@Zen, no en ninguna versión rsyncque haya usado. Si eso realmente te está sucediendo, te estás perdiendo la barra inclinada final al final del argumento del directorio de origen.
Adrian
3
Ese astuto tajo final es CLAVE ...
tutuca
desafortunadamente, esto no parece funcionar si destes un symlnk src, sino que termina copiando srcen src/src. Probado en macOS. Tenía la esperanza de que podía reemplazar bar -> foo/con bar/, pero tenía que utilizar un directorio temporal intermedio.
user5359531
@ user5359531 Si sabe que destes un enlace simbólico src, simplemente rm destantes de ejecutar el comando anterior. rsynces lo suficientemente inteligente como para crear destantes de copiar el contenido de src. No necesita un directorio temporal intermedio.
Adrian
1

Si el sistema de archivos antiguo y el nuevo son accesibles para su máquina, considere usar un enlace simbólico en lugar de rsync. Si su comando rsync que está utilizando no especifica hosts (o si son el mismo host), entonces este es el caso. Está intentando duplicar dos directorios con un nombre diferente en el mismo host. No use rsync para esto, ya que está duplicando los datos y tendrá que ejecutar su rsync a menudo para mantenerlos sincronizados.

El uso de un enlace simbólico es una solución única que reflejará dos directorios (con nombres diferentes) y casi no requiere espacio. Es como crear un directorio de alias que apunta a otro directorio.

Digamos que tenía el viejo git en un directorio llamado / old / path / old_git y ahora el repositorio de código se ha movido a / new / path / new_git

Tu puedes hacer:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Esto creará un enlace como tal:

/ old / path / old_git -> / new / path / new_git

De modo que cualquier cosa que se ponga en new_git estará disponible instantáneamente de la manera anterior también, sin duplicar datos y sin tener que sincronizarlos constantemente.

jrel
fuente
1
Tenga cuidado con el comando rm -rf old_git. Esto eliminará todo su repositorio old_git. Si no entiendo bien su problema, esto podría ser algo malo.
jrel
0

Encuentro una solución alternativa ahora.

El uso rysnc -r /origin/* /target/puede sincronizar todos los contenidos del directorio de origen al directorio de destino.

zen
fuente
8
Creo que esto no incluye archivos de puntos (.foo) porque estos no coincidirán con el asterisco
Ray Burgemeestre
que se basa en la expansión de shell glob, técnicamente pasará todos los archivos encontrados allí como argumento para rsync. Es casi lo mismo que correr rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Como señaló @RayBurgemeestre, la expansión de glob shell no incluirá archivos de puntos.
Florian Castellane