我有两个具有类似布局的目录树,即
.
|-- 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目录树来创建:
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“,我会得到”文件存在“错误,因为目录名称相互冲突。
更新:您可以假设两个目录树之间没有重复的文件。
发布于 2010-06-29 18:44:07
rsync -ax --link-dest=dir1/ dir1/ merged/
rsync -ax --link-dest=dir2/ dir2/ merged/这将创建硬链接,而不是移动它们,您可以验证它们是否被正确移动,然后删除dir1/和dir2/。
发布于 2010-06-29 18:34:10
为此,您可以使用重命名(也就是perl包中的rename )。注意,名称并不一定引用我在debian/ubuntu之外描述的命令(如果需要的话,它只是一个可移植的perl文件)。
mv -T dir1 merged
rename 's:^dir2/:merged/:' dir2/* dir2/*/*
find dir2 -maxdepth 1 -type d -empty -delete您还可以选择使用vidir (来自多个using ),并从您喜欢的文本编辑器中编辑文件路径。
发布于 2010-06-30 00:15:38
对于不同开发阶段的源代码树,我已经多次这样做了。我的解决方案是以以下方式使用Git:
您可以用分支等方法来处理它,但这是一般的想法。而且你不太害怕把它填满,因为你对每个州都有完整的快照。
https://serverfault.com/questions/155989
复制相似问题