介紹
Rsync是遠端和本地文件同步工具的縮寫。它使用一種算法來最小化複製的數據量,只移動已更改的文件部分。
在本教程中,我們將定義Rsync,審查使用rsync
時的語法,解釋如何使用Rsync與遠端系統同步,以及其他可用的選項。
使用DigitalOcean應用平台從GitHub部署您的前端應用程序。讓DigitalOcean專注於擴展您的應用程式。
先決條件
為了練習使用rsync
在本地和遠端系統之間同步文件,您需要兩台機器分別作為您的本地計算機和遠端計算機。這兩台機器可以是虛擬私有服務器、虛擬機器、容器或個人計算機,只要它們已經進行了正確的配置。
如果您計劃使用服務器來遵循此指南,建議您設置管理用戶並在每台服務器上配置防火牆。要設置這些服務器,請參照我們的初始服務器設置指南。
無論您使用什麼類型的機器來遵循此教程,您都需要在這兩台機器上創建SSH密鑰。然後,按照該指南的第2步的說明,將每個服務器的公共密鑰複製到另一個服務器的authorized_keys
文件中。
此指南在運行Ubuntu 20.04的機器上經過驗證,儘管它通常可以與運行Linux-based操作系統並安裝了rsync
的任何計算機一起使用。
定義Rsync
Rsync是一個非常靈活的網絡同步工具。由於它在Linux和類Unix系統上的普及程度以及作為系統腳本工具的流行程度,它通常預先安裝在大多數Linux發行版中。
理解Rsync語法
該rsync
的語法與其他工具類似,例如ssh
、scp
和cp
。
首先,運行以下命令進入您的主目錄:
然後創建一個測試目錄:
再創建另一個測試目錄:
現在添加一些測試文件:
現在有一個名為dir1
的目錄,其中有100個空文件。通過列出文件來確認:
Outputfile1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
您還有一個空目錄dir2
。要將dir1
的內容同步到同一系統上的dir2
,您將運行rsync
並使用-r
標誌,該標誌代表“遞歸”,並且對於目錄同步是必需的:
另一個選項是使用-a
標誌,它是一個組合標誌,代表“存檔”。此標誌遞歸同步並保留符號鏈接、特殊和設備文件、修改時間、組、所有者和權限。它比-r
更常用,是建議使用的標誌。運行與前一個示例相同的命令,但這次使用-a
標誌:
請注意,在前兩個命令的語法中,第一個參數的末尾有一個尾部斜線(/
),如下所示:
這個尾部斜線表示dir1
的內容。如果沒有尾部斜線,dir1
(包括目錄)將放在dir2
內。結果將創建以下層次結構:
~/dir2/dir1/[files]
另一个提示是在执行 rsync
命令之前仔细检查你的参数。Rsync 提供了一种方法来做到这一点,即通过传递 -n
或 --dry-run
选项。还需要 -v
标志,表示“详细”,以获得适当的输出。你将在以下命令中结合 a
、n
和 v
标志:
Outputsending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
现在将该输出与去除末尾斜杠时收到的输出进行比较,如下所示:
Outputsending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .
这个输出现在表明传输的是目录本身,而不仅仅是目录中的文件。
使用 Rsync 与远程系统同步
要使用 rsync
与远程系统同步,你只需要在本地和远程机器之间配置好 SSH 访问,并在两个系统上安装 rsync
。一旦验证了两台机器之间的 SSH 访问,你就可以使用以下语法将前一节中的 dir1
文件夹同步到远程机器。请注意,在这种情况下,你想要传输实际的目录,所以你将省略末尾的斜杠:
這個過程被稱為“推送”操作,因為它將本地系統中的目錄“推送”到遠端系統。相反的操作是“拉取”,用於將遠程目錄同步到本地系統。如果dir1
目錄位於遠端系統而不是您的本地系統上,語法將如下所示:
與cp
和類似工具一樣,源始始終是第一個參數,目的地始終是第二個。
使用其他Rsync選項
Rsync提供許多用於改變實用程序默認行為的選項,例如您在前一部分學習的標誌選項。
如果您要傳輸尚未壓縮的文件,如文本文件,則可以通過添加壓縮選項-z
來減少網絡傳輸:
-P
標誌也很有幫助。它結合了標誌--progress
和--partial
。第一個標誌為傳輸提供了進度條,第二個標誌允許您恢復中斷的傳輸:
Outputsending incremental file list
created directory destination
source/
source/file1
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101)
sourcefile10
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101)
source/file100
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101)
source/file11
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101)
source/file12
0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101)
. . .
如果再次運行命令,您將收到縮短的輸出,因為沒有進行任何更改。這說明了Rsync使用修改時間來確定是否進行了更改:
Outputsending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
假設您要使用以下命令更新一些文件的修改時間:
然後,如果您再次運行rsync
並使用-azP
,您將在輸出中注意到Rsync如何智能地重新複製僅更改的文件:
Outputsending incremental file list
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file2
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)
file3
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101)
. . .
為了保持兩個目錄的真正同步,如果從源中刪除了文件,有必要從目的地目錄中刪除它們。默認情況下,rsync
不會從目的地目錄中刪除任何內容。
您可以使用--delete
選項更改此行為。在使用此選項之前,您可以使用-n
,即--dry-run
選項,進行測試,以防止意外的數據丟失:
如果您希望排除正在同步的目錄中位於某個目錄內的某些文件或目錄,您可以通過在--exclude=
選項之後指定以逗號分隔的列表來實現:
如果您有指定要排除的模式,您可以使用--include=
選項為與不同模式匹配的文件覆蓋該排除:
最後,Rsync的--backup
選項可用於存儲重要文件的備份。它與--backup-dir
選項一起使用,該選項指定備份文件應存儲的目錄:
結論
Rsync可以簡化在網絡連接上的文件傳輸並增加本地目錄同步的健壯性。Rsync的靈活性使其成為許多不同文件級操作的良好選擇。
A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.