如果不存在,如何cp文件并创建目录?


15

我想将svn储存库中的已修改文件复制到另一个目录,同时保留其目录结构。

阅读awk和xargs手册页后,我找到了一种获取更改文件名的方法,如下所示:

$ 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复制文件并创建目录?并且请指出该命令链是否可以简化。:-)

感谢您的回复。由于目录有点大,所以我不想使用cp -R或rsync复制整个目录。CK关于使用焦油管的建议非常有用。

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

Answers:


12

几个简单的想法:

  • 添加一个mkdir -p $ {dirname FILE)
  • 你能用焦油管把它全部清理掉吗?

编辑

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

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

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

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


4

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

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

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

因此,以您为例:

rsync -rv ./ /tmp/xen/

-a,将保留时间戳,并且除其他外还具有递归性,即“ man rsync”。

意识到后更新,我读错了问题:

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

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

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

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

那是显而易见的,但是它将同步所有内容,而不仅仅是已修改的文件,对不对?
CK。

哎呀,错过了
凯尔·布​​兰特

2

这是一线参考:

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

用英语:

  • 使用获取感兴趣的文件列表svn status -q,该列表通过管道传输到...
  • awk提取带有文件路径的列: awk '{print $2}'
  • xargs用于将文件列表提供给tar,后者又将文件的tarball发送到stdout: xargs tar -c
  • 随即将其重新提取(-x)到目标目录(-C path):tar -xC /tmp/xen

1

使用“ dirname”提取路径“ mkdir -p”以创建它,类似于:

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

1

rsync -a不会创建比深度1更深的新目录,因此rsync只是部分解决方案,例如不适合我(当中间缺少几个目录时,我用Google搜索来找到如何将目录同步到某个远程层次结构的答案)

编辑:我的意思是,我有源目录:/home/user/projects/homework/1/1.1/我想将其同步到远程:/home/user/projects/homework/1/1.1/ ...但是目标目录还没有目录/ home / user / projects / homework ...并且我不想转移源计算机中/ home / user / projects /中的其他子目录

Edit2:找到了一种使用rsync --relative选项的方法:上面的示例如下所示:

cd / home / projects /; rsync -aR家庭作业/1/1.1 user @ remote:/ home / user / projects /


0

我建议以下内容:

  • 复制一切
  • 查找未修改的文件并将其删除,将已修改的文件保留在原处。

顺便说一句,带有R标志的cp递归地复制文件/文件夹。

cp -R

0
  • 建立目录结构到/tmp/f2文件中/tmp/f

    $ 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 \;
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.