rsync 是否可以不在目標上建立目錄?
想像一下我有這個來源:
a/
a/x.txt
b/
b/y.txt
我有這個目的地:
a/
a/z.txt
想要的結果rsync source destination
:
a/
a/x.txt
a/z.txt
當然,我的真實情況涉及數千個文件/資料夾結構,我不想要涉及同步資料夾的明確列表的解決方案,這是我可以做到的。我正在尋找一種乾淨的方法來防止在目標上建立任何資料夾。透過排除或過濾...這甚至可能是 rsync 之外的東西,例如如果 rsync 無法做到這一點,則具有權限的駭客...
作為訊息,這種情況很容易發生,就我而言,我有:
- 一台有 2 個磁碟的伺服器,比方說
A
&B
。還有本機驅動器C
。 - 我通常使用
rsync
同步(和合併)遠端A
&B
到本地C
。 - 有時我只想將一些
C
文件同步回A
和B
。 (只是新文件...而不是目標上不存在的資料夾)
答案1
請嘗試以下操作:
rsync -av src:/dir/to/files/* /dest/dir
如果您有多個巢狀子目錄,則需要先執行下列操作:
find /dir/to/files -type d -print
透過循環運行該目錄列表並每次調用 rsync。當然,假設您在遠端電腦上執行此操作,則需要透過 ssh 發出查找並將結果儲存在陣列中,然後執行 rsync 循環。
答案2
我現在為 rsync 實現了這個,並將補丁提交給上游: https://lists.samba.org/archive/rsync/2015-November/030455.html
答案3
也許進行正常的 rsync,然後在第二步中刪除所有新建立的資料夾......聽起來很危險。
為了提高此操作的安全性,您可以使用目標系統上的另一個使用者:
rsync $src $specialuser@server:$destination
刪除該使用者遠端建立的資料夾:
ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"
然後將權限設定回正常:
ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"
該死,這看起來很髒......這需要一些重大改進:D
答案4
我建議使用腳本在目標上建立一個 include_file 文件,將 a 附加/*
到結果的每一行:
尋找 [target_dir] -type d >[target_dir]/include.file
然後,您可以使用 rsync 來--include_file=[target_dir]/include.file
指定僅包含與該檔案中的模式相符的檔案—這應該是目標上您指定的點下的資料夾的完整清單。
如果您每次都建立腳本來執行此操作,則 include.file 中的清單將始終是最新的。否則,您可能決定偶爾刷新它們(您想要重新同步回的每台伺服器上都有一個)。
如果我稍後有時間,我會在這裡發布一個可用的 python 腳本,但這應該會給你一個很好的道路。