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

时间:2015-08-10 07:13:58

标签: linux debian

我知道有很多关于类似topcis的问题,但我仍然无法击败它。

我需要在Debian计算机上以递归方式将所有.svn目录从/var/foo复制到/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 \;

只复制svn内的foo目录,而另一次没有复制。

2 个答案:

答案 0 :(得分:2)

给出以下文件结构:

./
./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不会抱怨目标不存在
  • 而不仅仅使用cpcp -r
  • 整个命令都包含sh -c,以便可以执行{} {{}}等{{}}上的操作(以便shell为每个目录单独扩展它,而不是在调用时扩展它一次) dirname

find中的结果:

~/tmp2

所以你需要做的就是用./ ./a/ ./a/test/ ./a/test/2 ./test/ ./test/1 test替换.svn和选择目录。 只需记住在源目录中运行它,而不是使用绝对路径。

答案 1 :(得分:2)

我发现使用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)所有这些目录。然后,stdout中的存档由目标目录中的另一个tar实例提取(x)。归档tar会自动删除相对路径部分(../),但由于我们还要删除第一个路径组件(foo/),我们需要添加--strip-components

注意:只有当您没有要复制的 .svn个目录时才能使用此功能(超过$(getconf ARG_MAX)-2,我的系统上的目录超过200000 )。