在 Linux 中怎样使用cp命令合并目录树
怎样将两个布局相似的目录树合并成一个新的目录树？为理解该问题让我们思考下面的例子.假设 dir1 和 dir2 目录中分别有3个子目录a,b和c.目录布局如下所示:
在目录a,b和c中有一些文件，tree命令的输出将能更好的说明:
1. 使用cp命令创建合并:
现在我们将这两个目录合并成一个名为&quot;merged&quot;新的目录中.完成上述操作最简单的方式就是递归复制目录，如下图所示:
合并 cp Linux
112.10.38.27
非常实用的命令
ZMOM1031
2014-07-30T20:54:40.000
136.159.213.178
thanks
来自加拿大的 Firefox 69.0|Windows 7 用户
2020-02-26T03:24:56.000
怎样将两个布局相似的目录树合并成一个新的目录树？为理解该问题让我们思考下面的例子.假设 dir1 和 dir2 目录中分别有3个子目录a,b和c.目录布局如下所示:
在目录a,b和c中有一些文件，tree命令的输出将能更好的说明:
1. 使用cp命令创建合并:
现在我们将这两个目录合并成一个名为&quot;merged&quot;新的目录中.完成上述操作最简单的方式就是递归复制目录，如下图所示:
怎样将两个布局相似的目录树合并成一个新的目录树？为理解该问题让我们思考下面的例子。


![](/data/attachment/album/201407/30/162954tevkxzmvmpxe1mmx.jpg)


假设 dir1 和 dir2 目录中分别有3个子目录a,b和c.目录布局如下所示:


[![Layout of input directories](/c7e003989ee63ae28a9965f07d8cd5e781a6d066/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30312e6d657267655f6469725f6c61796f75742e706e67)](https://camo.githubusercontent.com/c7e003989ee63ae28a9965f07d8cd5e781a6d066/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30312e6d657267655f6469725f6c61796f75742e706e67) 输入目录布局


在目录a,b和c中有一些文件，tree命令的输出将能更好的说明:


[![Layout of files](/6cf1876121c14e858e7f8ceebc88ceaa3e9429cd/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30322e6d657267655f66696c655f6c61796f75742e706e67)](https://camo.githubusercontent.com/6cf1876121c14e858e7f8ceebc88ceaa3e9429cd/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30322e6d657267655f66696c655f6c61796f75742e706e67) 文件布局


### 1. 使用cp命令创建合并:


现在我们将这两个目录合并成一个名为"merged"新的目录中.完成上述操作最简单的方式就是递归复制目录，如下图所示:


[![Copy directories recursively to create new merge](/43ab1bb64b3d5c685b76f1eee75962be1a75ee2d/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30332e6d657267655f63705f7265637572736976652e706e67)](https://camo.githubusercontent.com/43ab1bb64b3d5c685b76f1eee75962be1a75ee2d/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30332e6d657267655f63705f7265637572736976652e706e67) 递归复制完成新的合并


#### 1.1 cp命令和替换带来的问题:


这种方式所带来的问题是该合并目录中所创建的文件为原文件的副本，并非原文件本身.别急, (你可能正在问自己) 如果不是原文件又有什么问题? 要回答你的问题，考虑下你有很多大文件的情况.那种情形下，复制所有的文件可能花费数小时。


现在让我们回到刚那问题上，且尝试使用mv命令而不是cp命令。


[![Attempt to merge with mv command](/473a8a021f1f58a9acef401846dbf894798b3f4f/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30342e6d657267655f6d765f7265637572736976652e706e67)](https://camo.githubusercontent.com/473a8a021f1f58a9acef401846dbf894798b3f4f/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30342e6d657267655f6d765f7265637572736976652e706e67) 企图使用mv命令进行合并操作


这些目录不能被合并.因此我们不能像这样使用mv命令去合并目录. 现在你该怎样将原文件保存到"merged"目录中？


### 2. 解决方法:


cp命令有一个非常有用的选项来帮助我们摆脱这种状况. cp命令的-l 或 --link选项能够创建硬链接而非原文件副本.让我们尝试一下。


在我们尝试cp命令的硬链接选项前，让我们查看一下原文件的inode号码. 可通过tree命令--inodes选项来查看inodes:


[![Display inodes of original files](/5515391c5bf31a97021297384ac7959b85a470ad/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30352e6d657267655f646973706c61795f696e6f6465732e706e67)](https://camo.githubusercontent.com/5515391c5bf31a97021297384ac7959b85a470ad/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30352e6d657267655f646973706c61795f696e6f6465732e706e67) 原文件的inodes


现在我们有了inodes的列表，对于cp命令可通过--link选项创建硬链接:


[![Merge directories with hard links](/8240d70a478ebb9087e86d94d97b1932b8be9c84/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30362e6d657267655f6372656174655f6c696e6b732e706e67)](https://camo.githubusercontent.com/8240d70a478ebb9087e86d94d97b1932b8be9c84/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30362e6d657267655f6372656174655f6c696e6b732e706e67) 使用硬链接合并的目录


#### 2.1 验证文件:


现在文件已经被复制，让我们验证一下inodes是否和原文件匹配:


[![Verify Inodes](/c523299b6224c62df598d47b595c23ddf34741b7/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30372e6d657267655f7665726966795f696e6f6465732e706e67)](https://camo.githubusercontent.com/c523299b6224c62df598d47b595c23ddf34741b7/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30372e6d657267655f7665726966795f696e6f6465732e706e67) Verify Inodes


#### 2.2 清除:


正如你所看到的，这些文件的inodes和原文件的一样。现在问题已经解决，且原文件已被复制到合并目录中.现在我们能够移除dir1和dir2目录。


[![Remove original directories](/1abf3a8598c7cd222932e7cf55d0dde7d3271618/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30382e6d657267655f636c65616e75702e706e67)](https://camo.githubusercontent.com/1abf3a8598c7cd222932e7cf55d0dde7d3271618/687474703a2f2f6c696e6f786964652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031342f30372f30382e6d657267655f636c65616e75702e706e67) 移除原始目录




---


via: <http://linoxide.com/linux-command/merge-directory-trees-linux/>


原文作者：[Raghu](http://linoxide.com/author/raghu/)


译者：[hunanchenxingyu](https://github.com/hunanchenxingyu) 校对：[Caroline](https://github.com/carolinewuyan)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出

