如何在不復製文件的情況下從多個其他目錄創建並自動同步“合併”目錄?
如果我有一些源目錄,例如
dir1
… ,dir2
我dir5
如何創建一個自動同步的“合併”目標目錄,其中包含源目錄的所有文件和目錄但不涉及復製文件?例如,我有以下源目錄結構……
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
我呼籲
touch
它dir1/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