rsync在同步資料夾內容這個工作上應用非常廣泛,但是rsync本身命令還是比較複雜,本文總結一下:
rsync = remote sync的簡稱 ,它 被用於在linux/unix系統中執行備份操作。rsnync用於從一個位置到另外一個位置同步檔案和資料夾。備份的地址可以是本地也可以是remote server。
rsync的重要功能:
- speed
首次使用時,rsync在source和destination folder之間複製全部內容。下次使用時,rsync只傳輸變更的塊或位元組到目的地,而這個機制將大大提升傳輸速度
- security
rsync允許對資料使用ssh協議加密
- less bandwidth
rsync使用對資料塊壓縮和解壓縮的辦法降低頻寬需求。
- privileges
無需特殊的特權來執行rsync
語法
$ rsync options source destination
source和destination可以是本地或者遠端目錄。對於遠端的情況,需要指定login name, remote server name and location
例1:在本地伺服器上同步兩個目錄
在本地機器上同步兩個目錄,使用rsync -zvr命令
$ rsync -zvr /var/opt/installation/inventory/ /root/temp building file list ... done sva.xml svB.xml . sent 26385 bytes received 1098 bytes 54966.00 bytes/sec total size is 44867 speedup is 1.63 $
上述命令中:
-z 開啟壓縮功能
-v verbose更多列印資訊
-r recursive
執行上述命令後,你會發現rsync copy會影響到檔案的timestamp資訊,這時因為預設rsync並不保護timestamp資訊
例2:在sync時,保留時間戳 -a(achive mode:recursive mode, 保留符號連結,保留許可權資訊,時間戳,以及owner,group資訊)
$ rsync -azv /var/opt/installation/inventory/ /root/temp/ building file list ... done ./ sva.xml svB.xml . sent 26499 bytes received 1104 bytes 55206.00 bytes/sec total size is 44867 speedup is 1.63 $注意這時你會發現source,dest檔案的時間戳等資訊是不變的 $ ls -l /var/opt/installation/inventory/sva.xml /root/temp/sva.xml -r--r--r-- 1 root bin 949 Jun 18 2009 /var/opt/installation/inventory/sva.xml -r--r--r-- 1 root bin 949 Jun 18 2009 /root/temp/sva.xml
例3:只同步一個檔案
只要在rsync命令中指定檔名稱即可:
$ rsync -v /var/lib/rpm/Pubkeys /root/temp/ Pubkeys sent 42 bytes received 12380 bytes 3549.14 bytes/sec total size is 12288 speedup is 0.99
例4:從本地到遠端
$ rsync -avz /root/temp/ thegeekstuff@192.168.200.10:/home/thegeekstuff/temp/ Password: building file list ... done ./ rpm/ rpm/Basenames rpm/Conflictname sent 15810261 bytes received 412 bytes 2432411.23 bytes/sec total size is 45305958 speedup is 2.87
當執行和remote server同步的動作時,你需要指定username,ip。也要指定遠端伺服器上的目的地目錄,格式是: username@machineIP:Path
這個過程中,rsync會要求輸入密碼。但是如果你有一個指令碼自動執行這個備份動作,你可能希望不要手動輸入密碼,這時可以參考: http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
例5:從遠端到本地
$ rsync -avz thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ rpm/Basenames . sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec total size is 45305958 speedup is 2.87
例6:remote shell for synchronization
rsync允許你指定你想使用的remote shell,你可以使用rsync -e ssh來enable the secured remote connection
$ rsync -avz -e ssh thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ rpm/Basenames sent 406 bytes received 15810230 bytes 2432405.54 bytes/sec total size is 45305958 speedup is 2.87
例7:不覆蓋目的地址上已經修改過的檔案
典型情況下,如果一個檔案在destination被修改的話,我們可能並不希望使用來自source的老檔案去覆蓋修改
使用rsync -u選項達到這個目的(即:如果目的地上修改過,那麼不要覆蓋它)在下面的例子中,Basenames檔案在destination上做了修改,因此如果使用-u選項,則不會被修改
$ ls -l /root/temp/Basenames total 39088 -rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames $ rsync -avzu thegeekstuff@192.168.200.10:/var/lib/rpm /root/temp Password: receiving file list ... done rpm/ sent 122 bytes received 505 bytes 114.00 bytes/sec total size is 45305958 speedup is 72258.31 $ ls -lrt total 39088 -rwxr-xr-x 1 root root 4096 Sep 2 11:35 Basenames
例8:只同步目錄tree structure(而不同步檔案)
使用-d想想將只從source到destination同步資料夾的tree structure,下面的例子,只會遞迴同步目錄樹,而目錄中的檔案不會同步
$ rsync -v -d thegeekstuff@192.168.200.10:/var/lib/ . Password: receiving file list ... done logrotate.status CAM/ YaST2/ acpi/ sent 240 bytes received 1830 bytes 318.46 bytes/sec total size is 956 speedup is 0.46
例9:檢視rsnync傳輸進度
當使用rsync來做備份時,你可能希望知道backup的進度,比如有多少個檔案已經copy了,以及copy的速度等資訊, rsync -progress將會列印rsync執行中的詳細資訊:
$ rsync -avz --progress thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... 19 files to consider ./ Basenames 5357568 100% 14.98MB/s 0:00:00 (xfer#1, to-check=17/19) Conflictname 12288 100% 35.09kB/s 0:00:00 (xfer#2, to-check=16/19) . . . sent 406 bytes received 15810211 bytes 2108082.27 bytes/sec total size is 45305958 speedup is 2.87
例10:刪除在Targe上建立的檔案
如果在source這一側並不存在一個檔案,而這個檔案本身又在destination上存在,那麼你可以指定刪除這個檔案,-delete選項完成這個功能
# Source and target are in sync. Now creating new file at the target. $ > new-file.txt $ rsync -avz --delete thegeekstuff@192.168.200.10:/var/lib/rpm/ . Password: receiving file list ... done deleting new-file.txt ./ sent 26 bytes received 390 bytes 48.94 bytes/sec total size is 45305958 speedup is 108908.55 注意:new-file.txt檔案將在rsync過程中被刪除
例11:在destination(target)上不建立新檔案
如果你喜歡,你可以只update(sync)那些在target上已經存在的檔案。如果source有新的檔案,而這個檔案本身在target上並不存在,那麼你可以通過-existing選項避免在destination上建立這些新檔案
首先在source上建立一個new-file.txt檔案
[/var/lib/rpm ]$ > new-file.txt
$ rsync -avz --existing root@192.168.1.2:/var/lib/rpm/ . root@192.168.1.2's password: receiving file list ... done ./ sent 26 bytes received 419 bytes 46.84 bytes/sec total size is 88551424 speedup is 198991.96
例12:檢視source/destination之間的變更
At source: $ ls -l /var/lib/rpm -rw-r--r-- 1 root root 5357568 2010-06-24 08:57 Basenames -rw-r--r-- 1 root root 12288 2008-05-28 22:03 Conflictname -rw-r--r-- 1 root root 1179648 2010-06-24 08:57 Dirnames At destination: $ ls -l /root/temp -rw-r--r-- 1 root root 0 Sep 3 06:39 Basenames -rw-r--r-- 1 root root 12288 May 28 2008 Conflictname -rw-r--r-- 1 bin bin 1179648 Jun 24 05:27 Dirnames 在這裡source和destination有兩個不同。owner/group,以及size不同。 $ rsync -avzi thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done >f.st.... Basenames .f....og. Dirnames sent 48 bytes received 2182544 bytes 291012.27 bytes/sec total size is 45305958 speedup is 20.76
在上面的例子中,在Basenames, Dirnames檔案的前面有一些奇怪的資訊,其實它非常重要:
> specifies that a file is being transferred to the local host. f represents that it is a file. s represents size changes are there. t represents timestamp changes are there. o owner changed g group changed.
例13:在檔案傳輸中包含和排除Pattern
rsync允許你給一個pattern,指定你希望在做同步過程中包含或者排除的檔案或者目錄
$ rsync -avz --include 'P*' --exclude '*' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done ./ Packages Providename Provideversion Pubkeys sent 129 bytes received 10286798 bytes 2285983.78 bytes/sec total size is 32768000 speedup is 3.19
上面的例子中它將僅僅包含那些以P打頭的檔案或者資料夾並且排除所有其他檔案
例14:不傳輸大的檔案
你可以告訴rsync不要傳輸大於指定大小尺寸的檔案,使用-max-size選項
$ rsync -avz --max-size='100K' thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp/ Password: receiving file list ... done ./ Conflictname Group Installtid Name Sha1header Sigmd5 Triggername sent 252 bytes received 123081 bytes 18974.31 bytes/sec total size is 45305958 speedup is 367.35
上面的例子使得rsync只傳輸那些小於100K大小的檔案。你也可以指定M或G
例15:傳輸整個檔案
rsync的一個重要功能是它只傳輸一個檔案的變更的塊到目的地,而不是傳輸檔案本省。如果網路頻寬本身並不是什麼問題,你可以傳輸整個檔案,通過-Wxuanxiang 這將加速rsync的處理速度,因為他不需要再在source和destination做checksum的運算了。
# rsync -avzW thegeekstuff@192.168.200.10:/var/lib/rpm/ /root/temp Password: receiving file list ... done ./ Basenames Conflictname Dirnames Filemd5s Group Installtid Name sent 406 bytes received 15810211 bytes 2874657.64 bytes/sec total size is 45305958 speedup is 2.87
本文原文來自於: http://www.thegeekstuff.com/2010/09/rsync-command-examples/
參考:https://rsync.samba.org/how-rsync-works.html