首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux中合并2个目录树而不进行复制?

在Linux中合并2个目录树而不进行复制?
EN

Server Fault用户
提问于 2010-06-29 18:05:09
回答 3查看 28.1K关注 0票数 35

我有两个具有类似布局的目录树,即

代码语言:javascript
复制
.
 |-- dir1
 |   |-- a
 |   |   |-- file1.txt
 |   |   `-- file2.txt
 |   |-- b
 |   |   `-- file3.txt
 |   `-- c
 |       `-- file4.txt
 `-- dir2
     |-- a
     |   |-- file5.txt
     |   `-- file6.txt
     |-- b
     |   |-- file7.txt
     |   `-- file8.txt
     `-- c
         |-- file10.txt
         `-- file9.txt

我想合并dir1和dir2目录树来创建:

代码语言:javascript
复制
 merged/
 |-- a
 |   |-- file1.txt
 |   |-- file2.txt
 |   |-- file5.txt
 |   `-- file6.txt
 |-- b
 |   |-- file3.txt
 |   |-- file7.txt
 |   `-- file8.txt
 `-- c
     |-- file10.txt
     |-- file4.txt
     `-- file9.txt

我知道我可以使用"cp“命令来完成这个任务,但是我想移动文件而不是复制,因为我想合并的实际目录非常大,包含了很多文件(数百万)。如果我使用"mv“,我会得到”文件存在“错误,因为目录名称相互冲突。

更新:您可以假设两个目录树之间没有重复的文件。

EN

回答 3

Server Fault用户

回答已采纳

发布于 2010-06-29 18:44:07

代码语言:javascript
复制
rsync -ax --link-dest=dir1/ dir1/ merged/
rsync -ax --link-dest=dir2/ dir2/ merged/

这将创建硬链接,而不是移动它们,您可以验证它们是否被正确移动,然后删除dir1/dir2/

票数 30
EN

Server Fault用户

发布于 2010-06-29 18:34:10

为此,您可以使用重命名(也就是perl包中的rename )。注意,名称并不一定引用我在debian/ubuntu之外描述的命令(如果需要的话,它只是一个可移植的perl文件)。

代码语言:javascript
复制
mv -T dir1 merged
rename 's:^dir2/:merged/:' dir2/* dir2/*/*
find dir2 -maxdepth 1 -type d -empty -delete

您还可以选择使用vidir (来自多个using ),并从您喜欢的文本编辑器中编辑文件路径。

票数 5
EN

Server Fault用户

发布于 2010-06-30 00:15:38

对于不同开发阶段的源代码树,我已经多次这样做了。我的解决方案是以以下方式使用Git:

  1. 创建一个git存储库,并添加dir1中的所有文件。
  2. 提交
  3. 从dir2中删除所有文件并复制文件
  4. 提交
  5. 查看两个提交点之间的差异,并就如何合并结果做出仔细的决定。

您可以用分支等方法来处理它,但这是一般的想法。而且你不太害怕把它填满,因为你对每个州都有完整的快照。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/155989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档