繁体   English   中英

Linux:递归复制“ .svn”目录

[英]Linux: copy “.svn” directories recursively

我知道有数十个关于类似topcis的问题,但我仍然无法克服。

我需要将所有.svn目录从/var/foo递归复制到Debian机器上的/var/foo2

/var/www/foo/.svn
/var/www/foo/bar/.svn
...

我尝试了以下两个命令,但均未成功:

find /var/foo -name ".svn" -type f -exec cp {} ./var/foo2 \;
find /var/foo -name ".svn" -type d -exec cp {} /var/foo2 \;

一旦只复制了foo内部的svn目录,而另一次则不复制任何内容。

给定以下文件结构:

./
./a/
./a/test/
./a/test/2
./b/
./b/3
./test/
./test/1

在要复制的目录中运行以下脚本:

find -type d -iname test -exec sh -c 'mkdir -p "$(dirname ~/tmp2/{})"; cp -r {}/ ~/tmp2/{}' \;

应该将所有测试目录复制到~/tmp2/

兴趣点:

  • 目录以一对一的方式复制到目的地
  • 父目录是预先创建的,因此cp不会抱怨目标不存在
  • 不仅使用cp ,还使用cp -r
  • 整个命令都用sh -c包装,因此可以对{}执行诸如dirname之类的操作(这样,shell会分别为每个目录扩展它,而不是在调用find将其扩展一次)

~/tmp2结果结构:

./
./a/
./a/test/
./a/test/2
./test/
./test/1

因此,您需要做的就是用所选目录替换.svn~/tmp2 test 只需记住要在源目录中运行它,而不要使用绝对路径。

我发现使用tar进行此类操作通常会使代码更具可读性:

$ mkdir /var/www/foo2
$ cd /var/www/foo2
$ find ../foo/ -type d -name .svn -exec tar c \{\} \+ | \
         tar x --strip-components=1

find将列出所有名为.svn目录,并调用tar使用所有这些目录创建( c )存档文件(发送到stdout )。 然后,目标目录中的另一个tar实例将stdout上的存档提取( x )。 相对路径部分( ../ )将由归档tar自动删除,但是由于我们还想删除第一个路径组件( foo/ ),因此需要添加--strip-components

注意:仅当您没有太多要复制的.svn目录(超过$(getconf ARG_MAX)-2 ,在我的系统上超过200000)时,此方法$(getconf ARG_MAX)-2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM