Linux

如何在不復製文件的情況下從多個其他目錄創建並自動同步“合併”目錄?

  • March 20, 2016

如果我有一些源目錄,例如dir1… ,dir2dir5如何創建一個自動同步的“合併”目標目錄,其中包含源目錄的所有文件和目錄但不涉及復製文件?

例如,我有以下源目錄結構……

dir1/
 - a
 - b

dir2/
 - b   <-- Note the duplicate name, this one is more recent than dir1\b
 - c
 - dir2.1/   <-- Subdirectories present too.
     - z

dir3/
 - d

…當“合併”時看起來像這樣:

merge/
- dir2.1/
    - z
- a
- b   <-- Which one to show is based on modified time; most recent first.
- c
- d

(假設可能有數十個目錄,其中包含數千個文件和子目錄。)

源列表中的所有文件和目錄應保持不變,並且“合併”的目標目錄不應佔用額外的儲存空間;即它可能只是由某個守護程序使用inotify 管理的所有符號連結。源目錄也經常添加和刪除文件和子目錄,這也需要盡快反映在“合併”目錄中。

一些使用範例:

我創建了一個新文件,dir3/e它會自動立即(或在幾秒鐘內)出現在merge目錄中。

我刪除了該文件dir1/a,它會自動立即(或在幾秒鐘內)從merge目錄中消失。

dir3/d通過打開編輯merge/d

我呼籲touchdir1/b有一個更新的修改日期dir2/b,因此merge/b自動更新以指向dir1/b它是最新的。

我刪除dir1/b,現在merge/b將指向舊文件dir2/b

我嘗試在其中創建一個文件,merge但出現錯誤,因為這樣做毫無意義!

動態組合多個目錄的內容正是聯合掛載(或聯合文件系統)的意義所在。Linux 上有幾種實現方式,但通常的實現方式總是優先選擇一個特定的分支(例如,如果兩者都存在,則dir2/file總是優先於)來解決分支之間的重複問題。dir1/file但是我剛剛發現**mergefs**具有更靈活的策略,特別是允許逐個文件選擇最新文件。

設置:

mkdir dir1 dir2 merge
echo 1 >dir1/b; echo 2 >dir2/a
sleep 1
echo 1 >dir1/a; echo 2 >dir2/b; echo 2 >dir2/c

現在我們安裝。我們newest為文件訪問 ( search) 和元數據修改 ( action) 設置了策略,並禁止創建 ( create)(您可以將創建傳遞到分支之一,或者始終相同,或者基於可用磁碟空間,甚至隨機!) .

$ mergerfs -o category.action=newest,category.search=newest,category.create=erofs dir1:dir2:dir3 merge
$ head merge/?
==> merge/a <==
1

==> merge/b <==
2

==> merge/c <==
2

$ rm dir2/c
$ echo merge/?
a b

解除安裝:fusermount -u merge

引用自:https://unix.stackexchange.com/questions/270961