限定備份檔案大小

rsync 也可以依照檔案的大小來選擇備份的檔案,假設在 myfolder 目錄中有以下這些檔案:

ls -l myfolder/
total 15632
-rw-r--r-- 1 pi pi  1658348 Feb  5 09:09 bluez-5.43.tar.xz
-rw-r--r-- 1 pi pi       94 Feb  5 07:57 chinese.py
-rw-r--r-- 1 pi pi     2736 Feb  5 07:57 find_edimax.c
-rw-r--r-- 1 pi pi 14332601 Feb  5 09:09 myfile.gz
-rw-r--r-- 1 pi pi      763 Feb  5 08:02 pack.c

--min-size 可以指定備份檔案的大小下限,例如只備份 1MB 以上的檔案:

rsync -avh --min-size=1M myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
myfile.gz

sent 16.00M bytes  received 57 bytes  31.99M bytes/sec
total size is 15.99M  speedup is 1.00

--max-size 可以指定備份檔案的大小上限,例如只備份 4KB 以下的檔案:

rsync -avh --max-size=4K myfolder/ backup/
sending incremental file list
./
chinese.py
find_edimax.c
pack.c

sent 3.91K bytes  received 76 bytes  7.97K bytes/sec
total size is 15.99M  speedup is 4,012.68

--min-size--max-size 也可以同時使用,例如只備份 1KB 到 2MB 之間的檔案:

rsync -avh --min-size=1K --max-size=2M myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
find_edimax.c

sent 1.66M bytes  received 57 bytes  3.32M bytes/sec
total size is 15.99M  speedup is 9.62

自動刪除來源檔案

如果想讓 rsync 在備份檔案之後,自動將來源檔案刪除(也就是相當於 mv 的效果),可以加上 --remove-source-files 參數:

rsync -avh --remove-source-files myfolder/ backup/
sending incremental file list
./
bluez-5.43.tar.xz
chinese.py
find_edimax.c
myfile.gz
pack.c

sent 16.00M bytes  received 154 bytes  10.67M bytes/sec
total size is 15.99M  speedup is 1.00

這樣執行 rsync 之後,myfolder/ 目錄會被清空,所有的資料都會被移到 backup/ 目錄中,所以請小心使用,別勿刪重要檔案。

測試 rsync 參數

初學者如果不確定自己的 rsync 參數是否正確,在實際執行之前可以加上 --dry-run 來測試一下,加上這個參數之後 rsync 執行時還是會輸出正常的訊息,不過並不會更動到任何的檔案:

rsync -avh --dry-run --remove-source-files myfolder/ backup/
sending incremental file list
bluez-5.43.tar.xz
chinese.py
find_edimax.c
myfile.gz
pack.c

sent 194 bytes  received 31 bytes  450.00 bytes/sec
total size is 15.99M  speedup is 71,086.85 (DRY RUN)

這樣可以方便使用者檢查自己的參數是否配置得宜。

crontab 定期備份

通常如果要在本地端進行備份,就可以在 crontab 中定期執行這樣的指令,將重要的資料定期備份至指定目錄:

# m h  dom mon dow   command
0 5 * * 1 rsync -a /path/to/folder /path/to/backup/

這樣系統就會在每週一的早上 5 點執行 rsync 備份檔案。

只更新既有檔案

如果在備份檔案時,只想要更新過去已經備份過得檔案,排出新增的檔案,可以使用 --existing 參數。

假設我們過去已經將 myfolder/ 的檔案備份至 backup/ 了:

rsync -avh myfolder/ backup/

而這時候又新增了一個新的檔案:

touch myfolder/new.file

若此時我們只要更新 backup/ 中已經存在的檔案,排除後來新增的,就可以使用 --existing 參數:

rsync -avh --existing myfolder/ backup/
sending incremental file list
./

sent 201 bytes  received 19 bytes  440.00 bytes/sec
total size is 15.99M  speedup is 72,702.46

顯示檔案變動資訊

執行 rsync 時加入 -i 參數可以個別檔案變動的資訊:

rsync -avhi myfolder/ backup/
sending incremental file list
.d..t...... ./
.f...p..... find_edimax.c
>f..t...... myfile.gz
>f+++++++++ new.file
>f.st...... pack.c

sent 14.34M bytes  received 79 bytes  3.19M bytes/sec
total size is 15.99M  speedup is 1.12

加入 -i 之後,每個檔案項目之前會多出一個標示字串,而這個標示字串的欄位有 11 個,分別為 YXcstpoguax,其意義如下:

  • Y< 代表檔案傳送至遠端,> 代表檔案傳送至本地端,c 代表本地端變動(建立目錄等),h 代表硬式連結(hard link),. 代表沒有變動,* 代表其餘欄位有包含訊息(例如 deleting)。
  • X:檔案類型,f 為一般檔案,d 為目錄,L 為連結檔,D 為設備檔(device),S 為特殊檔案(如 sockets 或 fifo)。
  • c:代表檔案內容有變動。
  • s:代表檔案大小有變動。
  • t:代表檔案時間戳記有變動。
  • p:代表檔案權限有變動。
  • o:代表檔案擁有者有變動。
  • g:代表檔案群組有變動。
  • u:保留欄位。
  • a:代表檔案 ACL 資訊有變動。
  • x:代表檔案擴充屬性(extended attribute)有變動。

參考資料:TecmintHTGdasunhegodaThe Geek StuffLinodemakeuseof