rsync 對於我的專案來說是一個不錯的選擇嗎?
我必須:
- 透過 SSH 將文件從來源資料夾複製到目標資料夾,
- 確保複製所有文件,
- 複製後刪除來源文件。
- 如果我有衝突名稱,我必須重新命名檔案。
看起來我可以使用選項:--remove-source-files(刪除原始檔)
但是rsync如何管理衝突,我可以有規則嗎?
我的專案中的用例:
我在伺服器 A 上運行科學計算,結果插入到資料夾「process」中,對於每個計算,我都有一個像這樣的儲存庫:/process/calc1。
現在我想將儲存庫「/calc1」傳輸到伺服器B(我得到/process/calc1),並從伺服器A刪除「calc1」。...
在另一次計算期間,我在伺服器A上得到「/process /calc2”,這個想法也是將“calc2”移到伺服器B上的“/process/”目錄中,然後我現在在伺服器B上:
- /process/calc1
- /process/calc2
(伺服器A上的/process /是空的)。
如果在新計算後伺服器 A 中有另一個資料夾(如「/process/calc1」)(如果伺服器 B 上已存在「/process/calc1」),rsync 將如何管理衝突(在伺服器 B 上)?
是否可以使用 rsync 新增規則,並在伺服器 B 中將“/process/calc1”重新命名為“process/calc1R2”?等等(例如:calc1R3)?
謝謝。
答案1
如果你真的想使用 rsync,聽起來你需要 --backup、--backup-dir 和 --suffix 的某種組合。我認為你能得到的最接近的東西是這樣的東西
rsync -abv --suffix R1 --remove-source-files src/ dst/
這將接近您想要的,但它不會完全按照您想要的方式重命名檔案。 --suffix 選項將文字附加到現有文件的末尾,但它僅在第一次衝突時執行此操作。如果您再次運行它,它只會覆蓋您的第一個備份。每次執行命令時,您都必須更改該後綴值,如果您使用帶有時間戳記的內容,這將起作用,例如:
rsync -abv --suffix `date +%Y%m%d%k%M%S` --remove-source-files src/ dst/
我不確定這對於您所追求的目標是否太過分了,但它應該滿足您的要求。
答案2
顧名思義,rsync 用於同步檔案。當「同步」時,這表示來源和目標上的檔案是相同的。這似乎不是您想要做的。
看起來您只想移動一些文件。您不需要為此使用 rsync。看來您使用的是 linux 或 BSD。您可以透過 ssh 使用 mv -n 。 -n 選項不會覆蓋現有檔案。這不是 100% 自動的。但是,我不明白該文件如何在您的情況下已經存在。文件將從來源複製到目標,然後從來源中刪除。您想再次運行相同的計算嗎?這就是為什麼你最終會得到同名檔案的原因嗎?我建議在資料夾名稱中附加運行號或批號。無論如何你都希望這一點是清楚的。您可以控制資料夾的命名方式嗎?還有更多細節嗎?我建議將命令放入 bash 腳本或類似腳本中。
答案3
對於 SSH,總而言之,使用以下命令:
透過遠端 shell 存取:
拉取:rsync [選項...] [USER@]HOST:SRC... [目標]
推播:rsync [選項...] SRC... [USER@]HOST:DEST
rsync(1) 中對此進行了全部解釋。
至於為 cronjob 編寫腳本,透過 ssh 自動進行 rsync 而無需密碼,也請查看 ssh-agent(1)。