Rsync
命令和cp
命令很像,但是功能似乎更加復雜點,主要用來備份數據。看了網上一堆介紹的文章,感覺不是很通俗易懂。下面按照我的理解,做一些筆記:
同步方式
之前接觸過一些同步軟件,例如堅果雲、百度雲盤等等,他們對於同步方式都是有一些選擇項的,下面列舉一些同步方式
單向同步
每次執行任務時,源目錄中新建和更新的文件將被復制到目標目錄中;目標目錄中對應源目錄中已經刪除的文件,將被刪除。此方式只是單向地對文件進行從源目錄到目標目錄的操作。如果您手工對目標目錄進行的任何文件操作,將被任務忽略。
雙向同步
每次執行任務時,不管源目錄還是目標目錄中新建和更新的文件都會被復制到另外一個目錄中;在任何一個目錄中刪除文件,另外一個目錄也會刪除對應的文件。當兩個目錄中文件的操作重疊時,任務會自動保留最新的操作。如果操作時間無法判斷,更新和新建文件的操作會優於刪除文件而被保留。此方式會對源目錄進行文件操作。
鏡像同步
每次執行任務時,任何在源目錄中新建或在目標目錄中刪除或在兩個目錄中更新的文件,都會從源目錄復制到目標目錄。任何在源目錄中刪除或在目標目錄中新建的文件都會從目標目錄中刪除。此方式始終保持目標目錄中的文件和源目錄中的文件一模一樣,任何目標目錄自身的文件變化將被去除。此方式會刪除目標目錄中多余的文件。
移動同步
每次執行任務時,源目錄中的任何文件都會被移動到目標目錄中去。目標目錄中如果存在相同文件將被覆蓋。移動后,源目錄被清空。
更新同步
每次執行任務時,源目錄中新建和更新的文件將被復制到目標目錄中,目標目錄中任務之前復制的所有文件將被刪除,只保留最新的文件。
累加同步
每次執行任務時,源目錄中新建和更新的文件將被復制到目標目錄中,目標目錄中的任何文件都不會被刪除。目標目錄中會保留所有在源目錄中曾經出現過的文件且都是最后一個版本。
增量備份
每次執行任務時,任務發現源目錄中有新建或更新的文件,則在目標目錄中建立一個子目錄來保存這些新文件。雖然保存的文件只反映了執行時源目錄的一部分,但您可以利用軟件中提供的文件恢復工具來恢復出執行時源目錄完整的目錄結構和所有文件。增量備份任務第一次執行時,會自動對源目錄做一次完全備份,以便以后能完全恢復。
完全備份
每次執行任務時,任務會在目標目錄中建立一個子目錄來保存源目錄中的所有文件。
除雙向同步和鏡像同步外,其它方式的任務在執行時,如果發現源目錄中的文件沒有發生變化,將不做任何處理,只會記錄一個最后檢查時間。雙向同步和鏡像同步如果碰到源目錄和目標目錄中的文件都沒有變化的情況,也將只記錄一個最后檢查時間。
除雙向同步和鏡像同步外,其它方式的任務對於用戶直接對目標目錄進行新建、更新、刪除的文件不做處理。也就是說,不是任務復制到目標目錄而存在的文件,任務認為它不存在,不是被任務刪除的文件,任務認為文件還在目標目錄中存在。
除雙向同步和移動同步外,其它方式的任務不會對源目錄進行文件操作。
Rsync的命令格式可以為以下六種:
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync 參數理解
-a
,--archive
歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD。-e
, --rsh=command 指定使用rsh、ssh方式進行數據同步。-r
,--recursive
對子目錄以遞歸模式處理。-l
,--links
保留軟鏈結。-L
,--copy-links
想對待常規文件一樣處理軟鏈結。-K
,--keep-dirlinks
treat symlinked dir on receiver as dir-v
,--verbose
詳細模式輸出。-z
,--compress
對備份的文件在傳輸時進行壓縮處理。
--deldete
–delete
:如果源端沒有此文件,那么目的端也別想擁有,刪除之。(如果你使用這個選項,就必須搭配 -r
選項一起)
--delete
刪除那些 DST 中 SRC 沒有的文件,就是說,DST 中如果存在和 SRC 不一樣的文件,那么這些文件就會在同步過程中刪除!這種同步方式是不是有點像鏡像同步。
為了搞清楚目錄加/
的區別,做了如下的對比:
目的:將源目錄test傳輸到遠程目錄/tmp下,即遠程目錄下/tmp/test
1.源目錄加斜線,目標目錄不加斜線:
結果顯示,加了斜線,會將源目錄下的文件,傳輸到目標目錄下。
如果目標目錄不存在,會創建目錄。
rsync -avlK ./test/ root@10.22.44.103:/tmp/test
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
./
a.txt
b.py
dd/
sent 208 bytes received 97 bytes 55.45 bytes/sec
total size is 0 speedup is 0.00
root@SZX1000395393:/tmp/test# ls
a.txt b.py dd
2.源目錄不加斜線,目標目錄不加斜線
不加斜線,直接將源目錄復制到目標目錄下,所以,test
整個目錄復制到了目標目錄下了。
root at node1 in /tmp
$ rsync -avlK ./test root@10.22.44.103:/tmp/test
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
test/
test/a.txt
test/b.py
test/dd/
sent 219 bytes received 98 bytes 57.64 bytes/sec
total size is 0 speedup is 0.00
root@SZX1000395393:/tmp# cd test/
root@SZX1000395393:/tmp/test# ls
test
root@SZX1000395393:/tmp/test# cd test
root@SZX1000395393:/tmp/test/test# ls
a.txt b.py dd
3. 源目錄不加斜線,目標目錄加斜線:
不加斜線,直接將源目錄復制到目標目錄下,所以,test
整個目錄復制到了目標目錄下了。
$ rsync -avlK ./test root@10.22.44.103:/tmp/test/
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
test/
test/a.txt
test/b.py
test/dd/
sent 219 bytes received 98 bytes 70.44 bytes/sec
total size is 0 speedup is 0.00
root@SZX1000395393:/tmp# cd test/
root@SZX1000395393:/tmp/test# ls
test
4. 源目錄加斜線,目標目錄加斜線:
結果顯示,加了斜線,會將源目錄下的文件,傳輸到目標目錄下。
$ rsync -avlK ./test/ root@10.22.44.103:/tmp/test/
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
./
a.txt
b.py
dd/
sent 208 bytes received 97 bytes 55.45 bytes/sec
total size is 0 speedup is 0.00
root@SZX1000395393:/tmp/test# ls
a.txt b.py dd
總結
- 源目錄加了斜線,效果就是將該目錄下的內容傳輸到目標目錄下。
- 源目錄不加斜線,效果就是將該目錄傳輸到目標目錄下。
- 目標目錄如果不存在,會自動創建目標目錄。
所以,為了實現最初的目的,可以通過:
$ rsync -avlK ./test/ root@10.22.44.103:/tmp/test
或者:
$ rsync -avlK ./test root@10.22.44.103:/tmp
-a 選項
-a
選項是rsync里比較霸道的一個選項,因為你使用-a選項,就相當於使用了-rlptgoD
這一坨選項。以一敵七,唯-a
選項也。(在看了前文之后,你應該可以很輕松的理解這七個選項的作用了)-a 選項的學名應該叫做
archive option,中文叫做歸檔選項。使用
-a` 選項,就表明你希望采取遞歸方式來同步,且盡可能的保持各個方面的一致性。- 但是
-a
選項也有阿克琉斯之踵,那就是-a無法同步“硬鏈接”情況。如果有這方面需求,要加上-H選項
實例
加不加 / 的區別
- 末尾不加
/
,表示的是將src這個目錄直接復制到文件夾下,如果dst目錄下沒有src,會自動創建src目錄
$ rsync -avzh --progress /apkg/backup/src /apkg/backup/dst
- 末尾加
/
,表示的是將src目錄下的內容復制到dst2文件夾下
$ rsync -avzh --progress /apkg/backup/src/ /apkg/backup/dst2
同步時,創建目錄
將本地機器上/data/repo/Log/
中的內容,歸檔到遠程機器上的/data/repo/Log/{repo}/
目錄中,{repo}
這個目錄遠程不一定有,需要創建:
rsync -avzh --progress --rsync-path="mkdir -p /data/repo/Log/{repo} && rsync " /tmp/{repo}/{repo}/log/ root@xxx.xxx.xxx.xxx:/data/repo/Log/{repo}/
參考
rsync -aL
示例:
一次傳輸多個文件到目標文件夾下
rsync -aL /apkg/FusionSwift/package_pool/DLRN_RPMS/current/cps-swift.noarch.rpm /apkg/FusionSwift/package_pool/DLRN_RPMS/current/cps-swift-proxy.noarch.rpm /apkg/FusionSwift/rpm_srv/euleros/2.0/noarch/
-e
示例:
rsync -avzKq --stats -e "ssh -i /usr/lib/python2.7/site-packages/apkg/actions/pool/id_rsa -o StrictHostKeyChecking=no" cps-pkg-pool-2.xxx.com:/data/cps/repo/FusionSwift/master/xxx/euler
## 參考
- [《rsync同步的藝術》–linux命令五分鍾系列之四十二](http://roclinux.cn/?p=2643) 推薦,詳細敘述了各選項的意義
- [RSYNC 的核心算法](https://coolshell.cn/articles/7425.html)
- [Linux命令中:rsync和cp之間的區別](https://www.cnblogs.com/kex1n/p/7008178.html)
- [使用 rsync 增量同步備份文件 ](http://einverne.github.io/post/2017/07/rsync-introduction.html)
- [Rsync命令詳解](http://blog.csdn.net/u010391029/article/details/51746641)
- [第2章 rsync(一):基本命令和用法](https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog243)
- [Rsync(遠程同步):10 Linux中Rsync命令的實際示例](https://www.howtoing.com/rsync-local-remote-file-synchronization-commands)
- [FileGee的8種同步和備份方式](http://www.sohu.com/a/121958339_365148)