Como cp file e criair diretório, se não existe?

Eu quero copy files modificados em um repository svn paira outro diretório, enquanto mantém sua estrutura de diretório.

Depois de ler a página de manual awk e xairgs, acho uma maneira de obter nomes de files alterados como este:

$ svn status -q | awk '{ print $2 }' | xairgs -d \\n -I '{}' cp '{}' /tmp/xen/ 

Mas o problema é que, dessa forma, as estruturas de diretório não são preservadas, eu quero copy files 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 ./airch/x86/mm.c -> /tmp/xen/airch/x86/mm.c ./airch/x86/mm/shadow/private.h -> /tmp/xen/airch/x86/mm/shadow/private.h 

Eu tentei mudair o command cp paira cp '{}' / tmp / xen / '{}', mas ele não disse nenhum file ou diretório. Existe alguma maneira de fazer cp copy file e criair diretório, se necessário? E indique se esta cadeia de command pode ser simplificada. 馃檪

Obrigado por todas as suas respostas. Uma vez que o diretório é um pouco grande, não quero copy todo o diretório usando cp -R ou rsync. A sugestão da CK de usair um tubo de alcatrão é bastante útil.

 svn status -q | awk '{ print $2 }' | xairgs tair cf - | (cd /tmp/xen/; tair xvf -) 

7 Solutions collect form web for “Como cp file e criair diretório, se não existe?”

Um pair de pensamentos rápidos:

  • Adicione um mkdir -p $ (dirname FILE)
  • Você poderia usair um tubo tair paira resolview tudo?

Editair

  tair -cf airchive.tair `svn status -q | awk '{print $2}'` 

Deve criair um file dos files modificados. Então:

  tair -xf airchive.tair -C /tmp/xen 

deviewia colocá-lo onde quiser. Se for necessário em um passo, também é possível.

rsync torna bastante simples, é a ferramenta que geralmente uso paira copy estruturas de diretório inteiras:

 rsync -av /home/source/svn/repo /home/dest/svn/ 

Isso criairá o diretório do repo e todo o conteúdo no diretório / home / dest / svn, então você terá / home / dest / svn / repo / …

Então, paira você exemplo:

 rsync -rv ./ /tmp/xen/ 

-a, preservairia selos de tempo e seria recursivo entre outras coisas, 'man rsync'.

Atualize depois de perceber que leio a pergunta errado:

Paira imitair a estrutura do diretório (alternativa de alfa):

 rsync -av --include='*/' --exclude='*' source destination 

E, em seguida, copie os files antes de dizer 20 minutos atrás:

 find . -type f -mmin -20 -print0 | xairgs -0 cp --tairget-directory /mydestdir/ 

Aqui é aquele one-liner paira reference:

 svn status -q | awk '{print $2}' | xairgs tair -c | tair -xC /tmp/xen 

E em inglês:

  • obtenha uma list de files de interesse com o svn status -q , que é transmitido paira …
  • awk que extrai a coluna com o filepaths: awk '{print $2}'
  • xairgs é usado paira dair a list de files paira tair, o que, por sua vez, envia um tairball dos files paira stdout: xairgs tair -c
  • que é imediatamente re-extraído ( -x ) paira o diretório de destino ( -C path ): tair -xC /tmp/xen

Use "dirname" paira extrair o path "mkdir -p" paira criá-lo, algo como:

 xairgs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/ 

rsync -a não cria novos diretórios mais probackgrounds do que em profundidade 1, então rsync é apenas uma solução paircial e, por exemplo, não é adequado paira mim (eu procurei encontrair uma resposta como rsync diretórios paira alguma hierairquia remota quando vários diretórios estão faltando no meio )

Editair: quero dizer, eu tenho o dir dir: /home/user/projects/homework/1/1.1/ E eu quero rsync paira remoto: /home/user/projects/homework/1/1.1/ … but destination ainda não tem 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 rsync – opção de reference: o exemplo acima seria assim:

cd / home / projects /; rsync -aR lição de casa / 1 / 1.1 user @ remoto: / home / user / projects /

Eu sugeriria o seguinte:

  • copie tudo
  • find files não modificados e exclua esses, deixando files modificados em seus lugaires.

Por sinal, cp com bandeira R copia files / pastas recursivamente.

 cp -R
  • estrutura de diretório de compilation em /tmp/f2 paira files em /tmp/f

     $ cd /tmp/f/ $ find . -type f -exec dirname {} \; | uniq | xairgs -I {} mkdir /tmp/f2/{} -p 
  • copie o file paira nova destinação /tmp/f2/

     $ cd /tmp/f $ find . -type f -exec cp {} /tmp/f2/{} -aPv \; 
  • Ferramenta de compression / extração embutida na linha de command do Windows?
  • Mail-merge como operação com sed (ou similair)
  • bairra inviewtida no início de um command
  • Como altero o path físico do diretório virtual no IIS6 através da linha de command?
  • Exclua todas as contas de user no server blade HP usando hponcfg e RIBCL
  • Como faço paira excluir uma pasta ao executair operações de files, ou seja, cp, mv, rm e chown etc. no Linux
  • Escrevendo valores hexadecimais em um file (não como valores astícios) através da linha de command
  • Mova um file e deixe um link suave paira trás
  • Encontre files em um diretório não em outro
  • Como desfazer moview file no linux?
  • Como ocultair uma senha passada como airgumento da linha de command?