如何cp文件和创build目录,如果不存在?

我想复制修改后的文件到一个svn仓库到另一个目录,同时保持其目录结构。

在阅读awk和xargs手册页后,我find了一种方法来获得像这样改变的文件名:

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

但问题是,以这种方式目录结构不保留,我想复制这样的文件:

 ./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 

我试图将cp命令更改为cp'{}'/ tmp / xen /'{}',但是它没有说这样的文件或目录。 有没有办法使cp复制文件和创build目录如果需要? 请指出这条命令链是否可以简化。 🙂

感谢您的答复。 由于目录有点大,我不想使用cp -R或rsync复制整个目录。 CKbuild议使用焦油pipe是非常有用的。

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

几个快速的想法:

  • 添加一个mkdir -p $(dirname文件)
  • 你可以使用焦油pipe道sorting吗?

编辑

  tar -cf archive.tar `svn status -q | awk '{print $2}'` 

应该创build修改文件的存档。 然后:

  tar -xf archive.tar -C /tmp/xen 

应该把它放在你想要的地方。 如果需要一步到位,那也是可能的。

rsync使得非常简单,它是我通常用于复制整个目录结构的工具:

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

这将创buildrepo目录及其所有内容在/ home / dest / svn目录中,因此您将拥有/ home / dest / svn / repo / …

所以对你来说,例如:

 rsync -rv ./ /tmp/xen/ 

-a将保存时间戳,并在其他事物中recursion,“man rsync”。

更新后实现我读错了问题:

模仿目录结构(tar替代):

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

然后在20分钟之前复制文件:

 find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/ 

以下是一行参考:

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

在英语中:

  • 获取感兴趣的文件列表svn status -q ,这是pipe道…
  • awk,用filepaths提取列: awk '{print $2}'
  • xargs用于给文件列表tar,然后将文件tarball发送到stdout: xargs tar -c
  • -x )到目标目录( -C path ): tar -xC /tmp/xen

使用“dirname”来提取path“mkdir -p”来创build它,如下所示:

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

rsync -a不会创build比深度1深的新目录,所以rsync只是部分解决scheme,例如不适合我(我search了一个答案如何rsync目录到一些远程层次,当几个目录在中间缺less)

编辑:我的意思是,我有源代码目录:/home/user/projects/homework/1/1.1/而我想同步到远程:/home/user/projects/homework/1/1.1/ …但目的地还没有目录/ home / user / projects / homework …而且我不想在/ home / user / projects /目录下的源机器上传输其他子目录,

Edit2:find一个方法,用rsync –relative选项:上面的例子会是这样的:

cd / home / projects /; rsync -aR homework / 1 / 1.1 user @ remote:/ home / user / projects /

我会build议如下:

  • 复制一切
  • find未经修改的文件并删除这些文件 ,将修改后的文件留在原处。

顺便说一下,带有R标志的cprecursion地复制文件/文件夹。

 cp -R
  • /tmp/f2中的文件build立目录结构到/tmp/f2

     $ cd /tmp/f/ $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p 
  • 复制文件到新的目的地/tmp/f2/

     $ cd /tmp/f $ find . -type f -exec cp {} /tmp/f2/{} -aPv \;