Linux

在Linux中合 併2個目錄樹而不複製?

  • July 15, 2017

我有兩個佈局相似的目錄樹,即

.
|-- 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”,由於目錄名稱衝突,我會收到“文件存在”錯誤。

更新:您可以假設兩個目錄樹之間沒有重複文件。

rsync -ax --link-dest=dir1/ dir1/ merged/
rsync -ax --link-dest=dir2/ dir2/ merged/

這將創建硬連結而不是移動它們,您可以驗證它們是否被正確移動,然後刪除dir1/dir2/.

奇怪的是沒有人注意到cp有選項-l

-l,--連結
硬連結文件而不是複制

你可以做類似的事情

% mkdir 合併
% cp -rl dir1 /* dir2 /* 合併
% rm -r 目錄*
% 樹去
走
├── 一個
│ ├── file1.txt
│ ├── file2.txt
│ ├── file5.txt
│ └── file6.txt
├── b
│ ├── file3.txt
│ ├── file7.txt
│ └── file8.txt
└── c
├── file10.txt
├── file4.txt
└── file9.txt

13 個目錄,0 個文件

引用自:https://serverfault.com/questions/155989