我知道有很多关于类似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
目录,而另一次没有复制。
答案 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
不会抱怨目标不存在cp
,cp -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 )。