rsync:避免刪除不屬於某個使用者的文件

rsync:避免刪除不屬於某個使用者的文件

我正在使用 rsync 使大型共用文件資料夾與我的筆記型電腦保持同步。更具體地說,我正在從我的筆記型電腦同步到共享儲存庫。我想做的是僅同步那些由我的用戶創建/修改的文件。作為共用儲存庫,其他人可能創建了其他目錄或檔案。

我瀏覽了各種 rsync 選項,但沒有找到我要找的東西。我可以--exclude--delete-excluded但只能提供與檔案名稱相符的模式,而不是任何其他元資料(或者我可以嗎?)。

另一個但有點麻煩的解決方案可以啟動一個遠端腳本,例如find -not -perm $USER > excluded_filesrsync ,但排除這些腳本,但我不想這樣做。

有任何想法嗎?

更新:澄清一下,我筆記型電腦上的資料只是伺服器上資料的一部分。這是一個例子

  • 我的筆記型電腦包含dir_1dir_2
  • 我將它們同步到伺服器;現在伺服器包含兩個目錄
  • 另一個使用者登入伺服器並建立新目錄dir_3
  • 我搞亂了我的文件,現在將再次 rsync 但需要使用 --delete
  • 我只想 --delete 僅刪除我首先創建的文件,即 和 上的dir_1文件dir_2不是 dir_3

答案1

我認為在筆記型電腦上保留所有文件的副本不是一個選擇。不然的話,事情就會容易很多。

這裡正確的工具就是版本控制工具。但我意識到,除非所有使用者都具備最低限度的技術複雜性,否則讓他們使用版本控制工具並不是一個現實的建議。即便如此,您也必須仔細選擇在筆記型電腦上查看的內容。

可能仍然使用版本控制。在共享電腦上,簽入您的所有文件,而不要管其他人的文件。在您的筆記型電腦上保留單獨的結帳單。每當您切換機器時都要提交並檢查。我想得越多,我就越喜歡這個選項:它不需要任何編碼,甚至不需要任何脆弱的腳本。


您進行雙向同步。 Rsync 不擅長這一點:如果您忘記運行它,或者意外地以錯誤的方向運行它,您可能會在沒有警告的情況下丟失工作。齊奏是雙向同步的好工具:它總是雙向同步,如果檔案在兩側都發生更改,它會發出錯誤訊息。它是開源的,並且可以很好地整合到 UNIX 和 Windows 平台中。

不幸的是,unison 沒有像 rsync 那樣可以按所有者忽略文件的選項。您可以使用 產生忽略列表find -user,但它會變得混亂,如果其他人在 運行find和 運行之間添加或刪除文件unison,則會出現競爭條件rsync

您可以修補 rsync 或 unison 以新增根據元資料忽略檔案的選項。我剛剛快速瀏覽了原始程式碼,在這兩種情況下,排除程式碼都與字串緊密相關,而不是與目錄條目緊密相關。它看起來可行,但它不是一個簡單的補丁。


您可以建立僅包含您的文件的檔案系統視圖。我沒有完整、無縫的解決方案,但這裡有一些可以開始的想法。

  • 如果共用電腦支援硬連結(所有 unice 都支持,只要您使用 NTFS,Windows 就從 NT4 開始支援),那麼建立僅包含文件硬連結的儲存庫副本就很容易了:

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    或使用 zsh:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

    在編輯或同步時,您必須小心不要破壞硬連結。我不知道 rsync 和 unison 如何應對。初始建立後,將刪除共用儲存庫中由您擁有且連結計數為 1 的文件,並在共用儲存庫中連結您視圖中連結計數為 1 的文件。這一切都很笨拙,我歡迎提出改進建議。

  • 如果共享機器支援保險絲,您可以使用它來建立僅包含您的文件的共用儲存庫的即時視圖。我不知道現有的 FUSE 檔案系統可以做到這一點,但是綁定檔案系統很接近(我還沒有查看代碼來評估編碼難度)。

  • 在執行 rsync 或 unison 時,您可以使用LD_PRELOADoverride readdir(或 Windows 等效項),以便它只傳回您擁有的檔案。

相關內容