Quiero copiar archivos modificados en un repositorio svn a otro directorio, mientras mantengo su estructura de directorios.
Después de leer la página de manual de awk y xargs, encuentro una manera de cambiar los nombres de archivo de esta manera:
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
Pero el problema es que de esta manera no se conservan las estructuras de directorios, quiero copiar archivos como este:
./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h
Intenté cambiar el comando cp a cp '{}' / tmp / xen / '{}' pero no dijo tal archivo o directorio. ¿Hay alguna forma de hacer un archivo de copia cp y crear un directorio si es necesario? Y señale si esta cadena de comandos se puede simplificar. :-)
Gracias por todas sus respuestas. Como el directorio es un poco grande, no quiero copiar todo el directorio usando cp -R o rsync. La sugerencia de CK de usar un tubo de alquitrán es bastante útil.
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
fuente
Aquí está esa frase para referencia:
Y en ingles:
svn status -q
, que se canaliza a ...awk '{print $2}'
xargs tar -c
-x
) en el directorio de destino (-C path
):tar -xC /tmp/xen
fuente
Use "dirname" para extraer la ruta "mkdir -p" para crearlo, algo así como:
fuente
rsync -a no crea nuevos directorios más profundos que en la profundidad 1, por lo que rsync es solo una solución parcial y, por ejemplo, no es adecuada para mí (busqué en Google para encontrar una respuesta sobre cómo rsync directorios a alguna jerarquía remota cuando faltan varios directorios en el medio )
Editar: Quiero decir, tengo el directorio fuente: /home/user/projects/homework/1/1.1/ Y quiero sincronizarlo con el control remoto: /home/user/projects/homework/1/1.1/ ... pero el destino todavía no tiene el directorio / home / user / projects / homework ... y no quiero transferir otros subdirectorios en la máquina fuente que están en / home / user / projects /
Edit2: Encontrado un camino, con rsync - opción relativa: El ejemplo anterior sería así:
cd / inicio / proyectos /; rsync -aR tarea / 1 / 1.1 usuario @ remoto: / inicio / usuario / proyectos /
fuente
Sugeriría lo siguiente:
Por cierto, cp con R flag copia archivos / carpetas de forma recursiva.
fuente
construir estructura de directorios
/tmp/f2
para archivos en/tmp/f
copiar el archivo a un nuevo destino
/tmp/f2/
fuente