rsync在同步文件夾內容這個工做上應用很是普遍,可是rsync自己命令仍是比較複雜,本文總結一下:html
rsync = remote sync的簡稱 ,它 被用於在linux/unix系統中執行備份操做。rsnync用於從一個位置到另一個位置同步文件和文件夾。備份的地址能夠是本地也能夠是remote server。linux
rsync的重要功能:shell
首次使用時,rsync在source和destination folder之間複製所有內容。下次使用時,rsync只傳輸變動的塊或字節到目的地,而這個機制將大大提高傳輸速度服務器
rsync容許對數據使用ssh協議加密網絡
rsync使用對數據塊壓縮和解壓縮的辦法下降帶寬需求。less
無需特殊的特權來運行rsyncssh
$ rsync options source destination
source和destination能夠是本地或者遠程目錄。對於遠程的狀況,須要指定login name, remote server name and locationide
在本地機器上同步兩個目錄,使用rsync -zvr命令ui
$ 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信息
$ 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
只要在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
$ 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/
$ 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
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
典型狀況下,若是一個文件在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
使用-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
若是在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過程當中被刪除
若是你喜歡,你能夠只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
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.
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打頭的文件或者文件夾而且排除全部其餘文件
你能夠告訴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
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