Eu quero copiar arquivos modificados em um repositório svn para outro diretório, mantendo sua estrutura de diretórios.
Depois de ler a página de manual awk e xargs, encontro uma maneira de alterar os nomes de arquivos como este:
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
Mas o problema é que, dessa maneira, as estruturas de diretório não são preservadas, desejo copiar arquivos 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
Tentei alterar o comando cp para cp '{}' / tmp / xen / '{}', mas não havia esse arquivo ou diretório. Existe alguma maneira de criar um arquivo de cópia de cp e criar um diretório, se necessário? E, por favor, indique se essa cadeia de comandos pode ser simplificada. :-)
Obrigado por todas as suas respostas. Como o diretório é um pouco grande, não quero copiar o diretório inteiro usando cp -R ou rsync. A sugestão de CK de usar um tubo de alcatrão é bastante útil.
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
fonte
Aqui está uma linha para referência:
E em inglês:
svn status -q
, que são canalizados para ...awk '{print $2}'
xargs tar -c
-x
) para o diretório de destino (-C path
):tar -xC /tmp/xen
fonte
Use "dirname" para extrair o caminho "mkdir -p" para criá-lo, algo como:
fonte
O rsync -a não cria novos diretórios com mais profundidade do que a profundidade 1, portanto, o rsync é apenas uma solução parcial e, por exemplo, não é adequado para mim (pesquisei no Google uma resposta sobre como rsync diretórios para alguma hierarquia remota quando vários diretórios estão ausentes no meio )
Edit: Quero dizer, eu tenho dir de origem: /home/user/projects/homework/1/1.1/ E quero sincronizá-lo remotamente: /home/user/projects/homework/1/1.1/ ... mas destino ainda não possui o diretório / home / user / projects / homework ... e não quero transferir outros subdiretórios na máquina de origem que estão em / home / user / projects /
Edit2: Encontrou uma maneira, com a opção rsync --relative: O exemplo acima seria assim:
cd / home / projetos /; lição de casa rsync -aR / 1 / 1.1 user @ remote: / home / user / projects /
fonte
Eu sugiro o seguinte:
A propósito, o cp com o sinalizador R copia arquivos / pastas recursivamente.
fonte
construir estrutura de diretório
/tmp/f2
para arquivos em/tmp/f
copiar arquivo para nova destinação
/tmp/f2/
fonte