本文為命令rsync的man文檔翻譯,幾乎所有的選項都翻譯了,另外關於篩選規則部分只翻譯了一部分。由於原文很多地方都比較啰嗦,所以譯文中有些內容可能容易讓國人疑惑,所以我個人在某些地方加上了注釋。若有錯誤之處,盼請指出。
本人譯作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
以下是rsync系列篇:
2.rsync(二):inotify+rsync詳細說明和sersync
rsync(1) rsync(1)
名稱
rsync - 一個快速、多功能的遠程(和本地)文件拷貝工具
摘要
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
當僅有一個SRC或DEST參數時將列出源文件列表而不是復制文件。
描述
Rsync是一個快速且功能非常豐富的文件拷貝工具。它可以在本地和遠程之間通過shell或rsync
服務互相拷貝文件。它提供了大量的選項來控制它各方面功能的行為,且在指定待拷貝文件方
面非常有彈性。它以其增量拷貝算法而出名,只拷貝源和目標不同的文件部分,因此減少網絡
間要傳輸的數據。Rsync每天都被廣泛用於做備份、鏡像和當作升級版拷貝命令。
Rsync使用"quick check"算法(默認)決定文件是否需要被傳輸,它會找出大小或最后修改時間
(mtime)不同的文件。當"quick check"算法表明了文件不需要被更新時,任何其他保留屬性(譯
者注:除大小和最后修改時間外的屬性)都將直接在目標文件上修改。
rsync的其他特性包括:
o 支持拷貝鏈接文件、設備文件、所有權(即所有者和所屬組)、屬組以及權限
o 支持類似於GNU tar命令的exclude和exclude-from選項
o 支持CVS排除模式以忽略相同的文件(譯者注:CVS是一種版本控制系統)
o 可以使用任意透明的遠程shell(remote shell),包括ssh或rsh
o 不要求超級管理員權限
o 以pipeline管道模型傳輸文件以便最小化降低成本
o 支持匿名或可身份認證的rsync daemon模式(做鏡像的理想方式)
一般特性
Rsync在本地或遠程主機之間拷貝文件(但不支持兩個遠程之間互相拷貝)。
rsync有兩種不同的方式聯系遠程主機:使用遠程shell程序作為傳輸方式(如ssh或rsh)或直接通
過TCP聯系rsync守護進程。當命令行中指定的源或目標主機后使用了單個冒號(:)時將使用遠程
shell傳輸模式。當在命令行中指定的源或目標主機后使用雙冒號(::)或使用了rsync://這種URL
時將表示使用TCP聯系rsync守護進程,但rsync://方式有一個例外,請參見下文"通過遠程SHELL
連接使用RSYNC-DAEMON特性"段落的內容。
但有一個特殊情況,如果只給定了源地址沒有給定目標地址,則將以類似於"ls -l"的格式輸出文
件列表。
若給定的源地址和目標地址都不是遠程地址,則在本機進行拷貝(見選項--list-only)。
Rsync命令中,本地端總是扮演"client"角色,遠程端總是扮演"server"角色。不要混淆"server"
和rsync daemon,rsync daemon一定是一個"server",但是"server"可能是一個rsync daemon也可
能是遠程shell派生出來的進程。
安裝
請閱讀README文件來查看安裝說明。
當安裝完成后,你可以通過遠程shell(也可以通過rsync daemon協議)讓rsync與任意你能訪問的主
機進行交流。對於遠程傳輸,現代rsync使用ssh與其他主機進行交流,但是可以配置其他默認的遠
程shell,如rsh或remsh。
你也可以通過命令行的"-e"選項或設置RSYNC_RSH環境變量來指定你想要使用的遠程shell。
rsync必須同時裝在源主機和目標主機上。
用法
rsync的使用方法和rcp一樣。你必須指定源地址和目標地址,其中一個可能是遠程地址。
也許解釋語法最好的方式是通過幾個示例:
rsync -t *.c foo:src/
這將會把當前目錄下所有能匹配*.c的文件傳輸到主機foo上的src目錄下。如果遠程主機上已經存在
某些同名文件,rsync的遠程更新(rsync-update)協議將會更新哪些有差異的文件。更詳細的內容見
技術報告。
rsync -avz foo:src/bar /data/tmp
這將會以遞歸方式把遠程主機foo上的src/bar目錄下的所有文件傳輸到本地主機的/data/tmp目錄下。
這些文件以歸檔(archive)模式傳輸,它保證在傳輸過程中保留符號鏈接、設備文件、屬性、權限、
所有者、所屬組等。另外,在傳輸過程中會使用壓縮功能以減少要傳輸的數據體積。
rsync -avz foo:src/bar/ /data/tmp
使用尾隨斜線(/)改變了原本的行為,它避免了在目標地址創建一個額外的目錄層次。帶有尾隨斜線
時,你可以理解為"拷貝目錄的內容"而不是拷貝"拷貝目錄名"(譯者注:即拷貝目錄本身),但是這兩
種情況都會將目錄中包含的文件傳輸到目標目錄下。換句話說,下面兩條命令都以相同的方式進行拷
貝,包括/dest/foo的屬性設置。
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
還需要注意的是,拷貝主機或引用模塊的默認目錄不需要尾隨斜線。例如,下面的命令都拷貝遠程
(默認)目錄的內容到本地的"/dest"。
rsync -av host: /dest
rsync -av host::module /dest
你也可以僅使用rsync的僅本地(local-only)模式,此模式下的源地址和目標地址名稱中都不需要冒號
(:)。它行為類似於cp命令的升級版。
最后,你可以通過移除模塊名參數部分的方式列出rsync daemon中所有可用模塊。
rsync somehost.mydomain.com::
更詳細信息見下面段落。
高級用法
請求從遠程主機傳輸多個文件的語法是通過指定和第一個遠程地址格式相同的多個遠程地址參數,或
者可以省略主機名部分。例如,下面的命令都會正常工作:
(譯者注:遠程地址中省略主機名時,將取前一個遠程地址的主機名作為它的主機名)
rsync -av host:file1 :file2 host:file{3,4} /dest/
rsync -av host::modname/file{1,2} host::modname/file3 /dest/
rsync -av host::modname/file1 ::modname/file{3,4}
老版本的rsync需要在SRC部分使用引號和空格,如下示例:
rsync -av host:'dir1/file1 dir2/file2' /dest
rsync host::'modname/dir1/file1 modname/dir2/file2' /dest
這種方式在后續rsync版本中將繼續(默認)有效,但是它沒有第一種方式簡便。
如果你要傳輸一個文件名中包含了空白字符的文件,可以使用"--protect-args"("-s")選項,也可以
使用轉義符將空白字符轉義。例如:
rsync -av host:'file\ name\ with\ spaces' /dest
連接RSYNC DAEMON
rsync也可以不使用遠程shell作為傳輸方式。這情況看下,將直接連接遠程RSYNC守護進程,一般使
用的是TCP的873端口。(顯然,這要求遠程的RSYNC守護進程必須是已運行的,見下文"啟動RSYNC服務
以接受連接請求")
這種方式的rsync使用方式和遠程shell方式一樣,除了:
o 需要使用雙冒號"::"分隔主機名和路徑,或者使用rsync://的URL格式。
o "path"部分的第一個詞語是一個模塊名(譯者注:如hostname::modname/file)。
o 遠程RSYNC守護進程可能會輸出你連接它的日期時間。
o 如果沒有指定遠程rsync服務的路徑名,將列出rsync服務主機上可訪問的路徑。
o 如果沒有指定本地目標地址,將列出遠程rsync服務主機上指定的文件。
o 必須不能指定"--rsh"("-e")選項。
以下是拷貝遠程模塊名為"src"中的所有文件示例:
rsync -av host::src /dest
遠程daemon上的某些模塊可能需要身份驗證。如果是這樣,在連接時將會被詢問輸入密碼。如果想要
避免被詢問,可以通過設置環境變量RSYNC_PASSWORD的值為你要使用的密碼,或者使用選項
"--password-file"。這非常適用於腳本中。
警告:在某些系統上,環境變量是對所有用戶可見的,此時建議使用"--password-file"選項。
你可以通過web代理(web proxy)的方式與rsync daemon建立連接,只需設置環境變量RSYNC_PROXY的
值為hostname:port指向你的web代理。但要注意,web代理的配置必須得支持與873端口的代理連接。
你還可以使用代理程序與rsync daemon建立連接,只需設置環境變量RSYNC_CONNECT_PROG的值為你想
要運行的命令來代替建立套接字連接。環境變量的值中可能會包含"%H",它代表rsync命令中所指定
的主機名(因此如果想在值中包含一個"%"字符,需要使用"%%")。例如:
export RSYNC_CONNECT_PROG='ssh proxyhost nc %H 873'
rsync -av targethost1::module/src/ /dest/
rsync -av rsync:://targethost2/module/src/ /dest/
上面的命令中使用ssh在proxyhost上運行了nc命令,它將會轉發所有數據到目標主機(%H)的873端口。
通過遠程SHELL連接使用RSYNC-DAEMON特性
某些時候使用rsync daemon的各種特性(如可命名的模塊)比允許任意套接字連接到系統上(除了真正
需要使用遠程shell的訪問)更方便。rsync支持使用遠程shell連接到主機上,它會派生出一個單用
途(single-use)的"daemon"服務用於讀取遠程用戶家目錄下的配置文件。如果你想要加密
daemon-sytle傳輸的數據,但由於daemon是被遠程用戶啟動的,你無法通過這樣的daemon使用像
chroot這樣的功能,也無法修改uid,這時使用遠程shell是比較好的。(另一個加密daemon傳輸的方
式是,使用ssh建立本地端口到遠程主機的隧道,並且在遠程主機上配置一個普通的rsync daemon只
允許從"localhost"發起連接(譯者注:其實就是配置ssh的端口轉發))
從用戶角度來看,使用遠程shell連接使用rsync daemon與連接普通rsync daemon的命令行語法幾乎
相同,唯一例外的是必須在命令行使用--rsh=COMMAND選項設置遠程shell程序。(設置RSYNC_RSH環境
變量不會打開此功能)例如:
rsync -av --rsh=ssh host::module /dest
如果需要指定不同用戶的遠程shell,一定要記住,host前綴"user@"設置的是rsync上的用戶(即用於
需要用戶認證的模塊)。這意味着必須在ssh命令中使用"-l user"選項來指定遠程shell,下面的例子
中使用了"--rsh"的短格式選項"-e":
rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest
"ssh-user"將在ssh上生效,而"rsync-user"將用於認證使用"module"模塊。(譯者注:對於連接目標
非daemon時,"ssh -l user"和"user@"作用是一樣的)
(譯者注:遠程shell連接使用rsync daemon,和真正的守護進程rsync daemon是不同的,后者是配置
好后永久監聽在后台提供服務,而遠程shell使用rsync daemon則是一種臨時性單用途的daemon進程,
雖然也會讀取配置文件,但它是由遠程shell進程fork出來的子進程,此次連接結束后,此daemon進
程會自動消逝)
啟動RSYNC服務以接受連接請求
要連接到一個rsync daemon,遠程系統上的rsync daemon必須已經運行(或者像inetd一樣,已經配置
了當特殊端口上有連接時會派生出rsync daemon)。關於如何啟動一個能處理從套接字進來的連接的
daemon的完整信息,請看rsyncd.conf(5),這是rsync daemon的配置文件,它包含如何運行daemon的
非常詳細的信息(包括獨立模式(stand-alone)和inetd格式的配置)
如果你使用的是某種遠程shell傳輸方式,則沒有手動啟動rsync daemon的必要。
傳輸過程中的排序
Rsync總是會在內部傳輸列表中對指定的文件名進行排序。這將會使得相同目錄名的文件被合並在一
起進行傳輸,這樣一來,去除重復文件名就比較容易,但這可能會讓一些人產生疑惑:文件傳輸時
的順序和命令行中給的順序不一致。
如果想要讓那個某個特殊的文件比其他文件先傳輸,可以將它們分隔到不同的rsync命令上,或考慮
使用"--delay-updates"選項(它不會影響傳輸時的排序,但會使得最后的文件更新(file-updating)
階段更迅速)。
示例
以下是一些我使用rsync的示例。
要備份包含了大量word文檔和郵件文件夾的家目錄,使用一個任務計划(cron job)運行:
rsync -Cavz . arvidsjaur:backup
每個晚上都將通過PPP連接到主機"arvidsjaur"上的backup目錄。
要同步samba源碼樹,使用下面的Makefile targets:
get:
rsync -avuzb --exclude '*~' samba:samba/ .
put:
rsync -Cavuzb . samba:samba/
sync: get put
這可以讓我和連接另一端的CVS目錄保持同步。然后再在遠程主機上做一些CVS操作,這節省了我大
量時間,因為遠程CVS協議的效率並不高。
我使用下面的命令在我的"old"和"new"ftp站點之間做一個鏡像:
rsync -az -e ssh --delete ~ftp/pub/samba nimbus:"~ftp/pub/tridge"
由於設置了cron計划,每隔幾小時它就登錄一次。
選項匯總
下面是rsync中可用的命令匯總,關於選項的完整描述,請看后文。
-v, --verbose increase verbosity
-q, --quiet suppress non-error messages
--no-motd suppress daemon-mode MOTD (see caveat)
-c, --checksum skip based on checksum, not mod-time & size
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
--no-OPTION turn off an implied OPTION (e.g. --no-D)
-r, --recursive recurse into directories
-R, --relative use relative path names
--no-implied-dirs don't send implied dirs with --relative
-b, --backup make backups (see --suffix & --backup-dir)
--backup-dir=DIR make backups into hierarchy based in DIR
--suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
-u, --update skip files that are newer on the receiver
--inplace update destination files in-place
--append append data onto shorter files
--append-verify --append w/old data in file checksum
-d, --dirs transfer directories without recursing
-l, --links copy symlinks as symlinks
-L, --copy-links transform symlink into referent file/dir
--copy-unsafe-links only "unsafe" symlinks are transformed
--safe-links ignore symlinks that point outside the tree
-k, --copy-dirlinks transform symlink to dir into referent dir
-K, --keep-dirlinks treat symlinked dir on receiver as dir
-H, --hard-links preserve hard links
-p, --perms preserve permissions
-E, --executability preserve executability
--chmod=CHMOD affect file and/or directory permissions
-A, --acls preserve ACLs (implies -p)
-X, --xattrs preserve extended attributes
-o, --owner preserve owner (super-user only)
-g, --group preserve group
--devices preserve device files (super-user only)
--copy-devices copy device contents as regular file
--specials preserve special files
-D same as --devices --specials
-t, --times preserve modification times
-O, --omit-dir-times omit directories from --times
--super receiver attempts super-user activities
--fake-super store/recover privileged attrs using xattrs
-S, --sparse handle sparse files efficiently
-n, --dry-run perform a trial run with no changes made
-W, --whole-file copy files whole (w/o delta-xfer algorithm)
-x, --one-file-system don't cross filesystem boundaries
-B, --block-size=SIZE force a fixed checksum block-size
-e, --rsh=COMMAND specify the remote shell to use
--rsync-path=PROGRAM specify the rsync to run on remote machine
--existing skip creating new files on receiver
--ignore-existing skip updating files that exist on receiver
--remove-source-files sender removes synchronized files (non-dir)
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before xfer, not during
--delete-during receiver deletes during the transfer
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
--delete-excluded also delete excluded files from dest dirs
--ignore-errors delete even if there are I/O errors
--force force deletion of dirs even if not empty
--max-delete=NUM don't delete more than NUM files
--max-size=SIZE don't transfer any file larger than SIZE
--min-size=SIZE don't transfer any file smaller than SIZE
--partial keep partially transferred files
--partial-dir=DIR put a partially transferred file into DIR
--delay-updates put all updated files into place at end
-m, --prune-empty-dirs prune empty directory chains from file-list
--numeric-ids don't map uid/gid values by user/group name
--timeout=SECONDS set I/O timeout in seconds
--contimeout=SECONDS set daemon connection timeout in seconds
-I, --ignore-times don't skip files that match size and time
--size-only skip files that match in size
--modify-window=NUM compare mod-times with reduced accuracy
-T, --temp-dir=DIR create temporary files in directory DIR
-y, --fuzzy find similar file for basis if no dest file
--compare-dest=DIR also compare received files relative to DIR
--copy-dest=DIR ... and include copies of unchanged files
--link-dest=DIR hardlink to files in DIR when unchanged
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
--skip-compress=LIST skip compressing files with suffix in LIST
-C, --cvs-exclude auto-ignore files in the same way CVS does
-f, --filter=RULE add a file-filtering RULE
-F same as --filter='dir-merge /.rsync-filter'
repeated: --filter='- .rsync-filter'
--exclude=PATTERN exclude files matching PATTERN
--exclude-from=FILE read exclude patterns from FILE
--include=PATTERN don't exclude files matching PATTERN
--include-from=FILE read include patterns from FILE
--files-from=FILE read list of source-file names from FILE
-0, --from0 all *from/filter files are delimited by 0s
-s, --protect-args no space-splitting; wildcard chars only
--address=ADDRESS bind address for outgoing socket to daemon
--port=PORT specify double-colon alternate port number
--sockopts=OPTIONS specify custom TCP options
--blocking-io use blocking I/O for the remote shell
--stats give some file-transfer stats
-8, --8-bit-output leave high-bit chars unescaped in output
-h, --human-readable output numbers in a human-readable format
--progress show progress during transfer
-P same as --partial --progress
-i, --itemize-changes output a change-summary for all updates
--out-format=FORMAT output updates using the specified FORMAT
--log-file=FILE log what we're doing to the specified FILE
--log-file-format=FMT log updates using the specified FMT
--password-file=FILE read daemon-access password from FILE
--list-only list the files instead of copying them
--bwlimit=KBPS limit I/O bandwidth; KBytes per second
--write-batch=FILE write a batched update to FILE
--only-write-batch=FILE like --write-batch but w/o updating dest
--read-batch=FILE read a batched update from FILE
--protocol=NUM force an older protocol version to be used
--iconv=CONVERT_SPEC request charset conversion of filenames
--checksum-seed=NUM set block/file checksum seed (advanced)
-4, --ipv4 prefer IPv4
-6, --ipv6 prefer IPv6
--version print version number
(-h) --help show this help (see below for -h comment)
Rsync以daemon方式運行時,還可以接受以下選項:
--daemon run as an rsync daemon
--address=ADDRESS bind to the specified address
--bwlimit=KBPS limit I/O bandwidth; KBytes per second
--config=FILE specify alternate rsyncd.conf file
--no-detach do not detach from the parent
--port=PORT listen on alternate port number
--log-file=FILE override the "log file" setting
--log-file-format=FMT override the "log format" setting
--sockopts=OPTIONS specify custom TCP options
-v, --verbose increase verbosity
-4, --ipv4 prefer IPv4
-6, --ipv6 prefer IPv6
-h, --help show this help (if used after --daemon)
選項
Rsync可以接受長格式選項和段格式選項,下面列出了所有可使用的選項。如果以多種方式指定同一
個選項,則使用逗號分隔。某些選項只有長格式,沒有短格式。如果選項要帶參數,參數只能列在長
格式選項后。如果要指定選項的參數,可以使用"--option=param"的格式,也可以使用空白字符替換
"="。某些參數可能需要使用引號包圍,避免被shell命令行解析。需要記住,文件名中的前導波浪號
(~)是被shell替換的,因此"--option=~/foo"將不會從波浪號進入家目錄(若要如此,將"="移除)
--help 輸出所有選項簡短格式的幫助信息並退出。為了兼容老版本,當只使用一個"-h"選項時也會
輸出這些幫助信息。
--version
輸出rsync的版本號並退出。
-v, --verbose
該選項增加了傳輸過程中的大量信息。默認情況下,rsync以靜默(silent)模式工作。單個
"-v"將給出哪些文件正在被傳輸的信息,還會在傳輸結束時給出一個簡要總結信息。兩個
"-v"選項(-vv)將給出哪些文件被忽略,並且在傳輸結束時給出更詳細的信息。超過兩個
"-v"選項一般只在調試過程中使用。
需要注意的是,傳輸過程中輸出的文件名是被"--out-format=%n%L"處理過的,它表示僅顯
示文件名,如果是軟鏈接文件,則還顯示它指向誰。當使用一個"-v"選項時,將不會告訴你
文件的屬性改變了。如果明確要列出改變了屬性的文件列表(既可以使用"--itemize-change"
也可以在"--out-format"中增加"%i"),(客戶端)輸出結果中將總是會增加所有已改變的條目
清單。更詳細信息見"--out-format"選項。
-q, --quiet
該選項將減少大量傳輸過程中的信息,但無法禁止從遠程主機產生的信息。該選項適用於
cron任務計划中。
--no-motd
此選項會影響客戶端在守護程序傳輸開始時輸出的信息。它會禁止motd信息,但是也會影響
daemon對"rsync host::"請求顯示模塊列表的回應信息,因此如果想要請求daemon的模塊列
表,應該忽略該選項。
-I, --ignore-times
正常情況下,rsync會忽略文件大小相同且最后修改時間戳相同的文件,該選項關閉"quick
check"行為,使得所有的文件都會被更新。
(譯者注:即從增量拷貝變成全量拷貝)
--size-only
該選項將修改rsync查找需要被傳輸文件的"quick check"算法,默認該算法會找出所有大小
或最后修改時間戳改變文件並傳輸,使用該選項將僅查找大小改變的文件並傳輸。在使用了
某些鏡像備份但沒有保留精確時間戳的情況下,使用帶有該選項的rsync將非常有幫助。
--modify-window
當比較時間戳時,rsync會把兩者相差不超過該選項所指定的值時認為是相同的時間戳。正常
情況下該選項的值為0(精確匹配),但在某些情況下,將此選項的值設置為非0將非常有用。
特別是與Windows的FAT文件系統(此文件系統有2秒范圍內的精確度差異)傳輸數據時,設置
"--modify-window=1"將非常有用(允許文件時間戳有1秒的差異)。
-c, --checksum
此選項改變了rsync檢查文件改變和決定是否要傳輸的方式。不使用該選項,rsync使用
"quick check"(默認的)檢查發送端和接收端兩邊文件的大小和最后一次修改時間是否改變。
使用該選項,將對每個匹配了大小的文件比較128位的校驗碼。生成校驗碼意味着兩端都會消
耗大量的磁盤I/O以讀取傳輸隊列中文件的數據內容(傳輸隊列早於讀取文件數據,即先quick
check,再生成和比較校驗碼),因此該選項會大幅度降低效率。
發送端生成校驗碼的時刻是做文件系統掃描以生成可獲取文件列表時。接收端生成校驗碼的
時刻是在掃描哪些文件發生改變時,它會對那些與發送端文件大小相同的文件生成校驗碼。
所以,該選項的結果是:只傳輸校驗碼改變或文件大小改變(意味着校驗碼也改變)的文件。
注意,rsync默認總是在文件傳輸完成后再生成全部文件(whole-file)的校驗碼,並驗證傳輸
完成的文件是否正確重組。但是使用該選項,它隱含了在傳輸前做"該文件是否需要更新?"
的檢查,使得文件傳輸結束后不會自動去驗證它們重組的正確性。
從協議30版本開始(對應的rsync版本從3.0.0開始)使用的校驗碼是MD5格式的,更老的協議版
本使用的校驗碼是MD4格式的。
(譯者注:即基於checksum來判斷文件是否要同步,而不是基於quick check算法。在兩個地
方會計算checksum:sender端發送文件列表時,接收端的generator判斷文件是否要傳輸時)
-a, --archive
該選項等價於"-rlptgoD"選項的組合。它表示使用歸檔模式並保留幾乎所有屬性(明顯遺漏了
"-H"選項)。上面的等價選項的唯一例外是指定了"--files-from"選項,它使得"-r"選項被強
制忽略。
注意,"-a"選項不保留硬鏈接屬性,因為查找多個硬鏈接文件是非常昂貴的。若要保留硬鏈
接屬性,必須與"-a"分開獨立使用"-H"選項。
--no-OPTION
在選項前面加上前綴"no-"表示關閉該選項的隱含選項功能。不是所有選項都能使用"no-"前
綴:只有那些隱含了其他選項的選項(如--no-D,--no-perms)或者不同環境下有不同默認值的
選項(如--no-whole-file,--no-blocking-io,--no-dirs)。"no-"后面即可以接短格式選項,
也可以接長格式選項(如--no-R等價於--no-relative)
例如:你想使用"-a"選項但不想使用它的隱含選項"-o"(--owner),即讓"-a"等價於
"-rlptgD",可以指定"-a --no-o"(或-a --no-owner)。
選項的順序是非常重要的:如果指定"--no-r -a",則最終會啟用"-r"選項,與之相反的是
"-a --no-r"。同樣需要注意的是"--files-from"的副作用,它的位置順序不重要,因為它影
響了某些選項的默認行為,並輕微改變了"-a"的意義(見"--files-from"選項以獲取更詳細說
明)。
-r, --recursive
此選項告訴rsync以遞歸模式拷貝目錄。參見"--dirs"(-d)。
從rsync 3.0.0開始,現在使用的遞歸算法是一種增量掃描,比以前少占用很多內存,並且在
最初掃描完一些目錄后就開始進行數據傳輸。增量掃描僅影響遞歸算法,不會改變非遞歸的
傳輸類型。同樣,只有傳輸兩端的版本都高於3.0.0才會如此。
某些選項要求rsync知道完整的文件列表,所以它們會禁用增量遞歸模式。這些選項包括:
--delete-before,--delete-after,--prune-empty-dirs和--delay-updates。正因為如此,
如果兩端rsync版本都高於3.0.0時,指定"--delete"時的默認刪除模式變為
"--delete-during"(可以使用"--del"或"--del-during"來精確指定刪除模式)。同樣,選擇
使用"--delete-delay"選項比"--delete-after"會更好。
增量遞歸模式可以使用"--no-inc-recursive"(--no-i-r)選項來禁用。
-R, --relative
表示使用相對路徑。這意味着會將命令行中指定的全路徑名而非路徑最尾部的文件名發送給
服務端。當要一次性發送多個不同目錄時該選項非常有用。例如,如果使用下面的命令:
rsync -av /foo/bar/baz.c remote:/tmp/
這將會在遠程主機上的/tmp/目錄下創建一個baz.c文件。如果使用下面的命令:
rsync -avR /foo/bar/baz.c remote:/tmp/
將會在遠程主機的/tmp/目錄下遞歸創建foo/bar/baz.c,它保留了命令行中指定的全路徑。
這些額外的路徑元素被稱為"隱含目錄"(如上例中的foo和foo/bar)。
從rsync 3.0.0開始,rsync總是會發送這些隱含目錄作為文件列表中的真實的目錄,即使發
送端的某個路徑元素是一個軟鏈接。這使得拷貝全路徑文件時,不用擔心因為路徑中包含了
軟鏈接而可能出現的非預期的問題(譯者注:即鏈接追蹤)。如果要復制服務端符號鏈接,請
通過其路徑來復制符號鏈接,並通過實際路徑來復制器真實對象。如果rsync版本較老,可
能需要使用"--no-implied-dirs"選項。
也可以對所指定的路徑限制發送時作為隱含目錄的路徑信息。從rsync 2.6.7版本開始,
rsync可以在源路徑插入一個點".",就像這樣:
rsync -avR /foo/./bar/baz.c remote:/tmp/
這將會在遠程主機上創建/tmp/bar/baz.c。(注意點后面必須跟上斜線,因此"/foo/."將不會
被縮寫)對於更老版本的rsync,可能需要改變目錄來限制源路徑。例如,推送文件時:
(cd /foo; rsync -avR bar/baz.c remote:/tmp/)
(注意,括號將把兩個命令放入子shell中執行,因此cd改變目錄不會影響未來的命令)如果使
用老版本的rsync拉取文件,使用以下慣用格式(但只適用於非daemon的傳輸):
rsync -avR --rsync-path="cd /foo; rsync" \
remote:bar/baz.c /tmp/
--no-implied-dirs
該選項影響"--relative"選項的默認行為。當指定該選項時,在傳輸時不會包含源文件的隱
含目錄。這意味着目標主機上對應路徑元素會被保留不變(如果它們存在的話),並且缺少的
隱含目錄會以默認屬性方式被創建。甚至允許目標主機上隱含路徑元素和源地址的屬性有非
常大的區別,例如在接收端某文件可能是某個目錄的符號鏈接。
另外,當rsync要傳輸的文件為"path/foo/file"時,如果使用"--relative"選項,則目錄
"path"和"path/foo"是隱含目錄。如果在目標主機上"path/foo"是一個指向"bar"文件的符號
連接,接收端的rsync會刪除"path/foo",並重建它為一個目錄,然后將接收到的文件放入此
新目錄中。使用"--no-implied-dirs"選項,接收端使用已存在的路徑元素更新
"path/foo/file",意味着最終會在"path/bar"中創建file文件。另一個實現連接保留功能的
方法是使用"--keep-dirlinks"選項(也將會使得后續的傳輸從符號鏈接定位到目錄中)。
當使用早於3.0.0版本的rsync拉取文件時,如果發送端的路徑中包含了符號鏈接,並且希望
隱含目錄能以普通目錄方式被傳輸時,可能需要使
用該選項。
-b, --backup
當使用該選項時,如果目標路徑中已存在需要被傳輸或需要被刪除的文件時將重命名該文件。
可以使用"--backup-dir"選項控制備份文件的保存路徑,使用"--suffix"選項控制備份時追
加在原文件名后的后綴。
注意,如果不指定"--backup-dir"選項:(1)將隱含"--omit-dir-times"選項(2)如果
"--delete"選項同時影響該文件,rsync將在排除規則的尾部添加一個起"保護"作用的篩選規
則(例如,-f "P *~"),這會阻止之前備份的文件被刪除。注意,如果你使用了自己定義的篩
選規則,你可能需要手動插入你的exclude/include規則,並且保證其優先級較高防止被其他
規則先匹配上而導致失效。
--backup-dir=DIR
結合"--backup"選項一起使用,這表示rsync在遠端將存儲所有備份文件到指定的目錄下。這
可用於增量備份。可以使用"--suffix"選項額外指定備份后綴(否則備份到指定目錄的文件將
使用原文件名)。
需要注意如果擬制定了一個相對路徑,備份目錄將會相對到目標目錄,因此你可能真正想要
指定的是一個絕對路徑或以"../"開頭的路徑。如果接收端是rsync daemon,備份目錄將無法
超出模塊的路徑層次結構,因此請特別注意不要將其刪除或復制到其中。
--suffix=SUFFIX
該選項可自定義"--backup"(-b)選項的備份文件名后綴,如果沒有指定"--backup-dir"選項,
則默認后綴為"~",否則后綴為空字符串。
-u, --update
該選項將強制忽略在目標路徑下已存在且修改時間比源文件更新的文件。(如果已存在的目標
文件的修改時間和源文件相同,則只在文件大小不同時才會更新)
注意該選項不會影響軟鏈接或其他特殊文件的拷貝機制。而且,不管兩端文件中的數據是否
相同,考慮發送端和接收端不同的文件格式對於更新來說也是非常重要的。換句話說,如果
源文件是一個目錄,而目標已存在的同名文件卻是一個普通文件,則rsync會直接忽略它們的
時間戳。
該選項是一種傳輸規則,不是排除規則,因此不會影響進入file-lists的文件,也因此不會影
響刪除。它僅會限制接收端請求傳輸的文件。
--inplace
該選項會改變當數據需要更新時,rsync傳輸文件的方式。默認情況下,rysnc會創建一個文件
的新副本,當此文件傳輸完成時會將此副本移動到指定的路徑下。使用此選項后,將直接把更
新部分的數據寫入到目標文件中。
(譯者注:此選項的拷貝機制可以理解為類似於drbd基於塊的拷貝機制)
這會帶來以下幾種影響:
o 硬鏈接不會被破壞。這意味着通過其他硬鏈接文件可以直接訪問到新數據。更進一步
說,嘗試拷貝不同源文件到多重鏈接的目標文件時,將導致目標數據像"拔河"一樣,
來來回回地變化。
o 使用中的二進制程序不會被更新(操作系統會防止這樣的事情發生,二進制程序自身也
會在嘗試數據交換時崩潰)。
o 在傳輸過程中,文件的數據會進入不一致狀態,並且如果傳輸被中斷或者更新失敗時,
文件將繼續不一致。
o rsync無法將數據寫入一個無法被更新的文件中。雖然超級管理員可以更新任意文件,
但普通用戶需要獲取文件的寫權限才能打開文件並向其中成功寫入數據。
o 如果目標文件中的數據在它被復制到某個位置之前被覆蓋,則rsync的增量拷貝效率會
降低。如果使用了"--backup"則不會出現這樣的問題,因為rsync足夠智能,它會使用
備份文件作為傳輸的基准文件。
警告:不能使用該選項對那些正被其他用戶訪問的文件,因此在選擇使用此選項進行拷貝時需
要小心謹慎。
該選項適用於對於那些基於數據塊(block-based)改變或向文件尾部追加了數據的大文件,也
適用於那些安裝在磁盤上而非網絡上的系統。它也能有效幫助保持寫時復制(copy-on-write)
文件系統的快照。
該選項隱含了"--partial"選項(因為傳輸中斷不會刪除文件),但和"--partial-dir"以及
"--delay-udpates"選項沖突。
--append
該選項使得rsync以追加數據到文件尾部的方式來更新文件,它會假定接收端上已存在的文件
和發送端文件的前段數據是一致的。如果接收端上文件的大小等於或大於發送端文件的大小,
則此文件會被忽略。該選項不會干涉不被傳輸文件的非內容屬性(non-content,如權限,所有
者等),也不會影響對非普通文件(non-regular)的更新。隱含了"--inplace"選項,但是和
"--sparse"選項不沖突(因為它總是擴充一個文件的長度)。
--append-verify
工作方式類似於"--append"選項,但是接收端已存在的數據在驗證階段會被包含在whole-file
校驗碼中,如果最后驗證階段失敗了,該文件會被傳輸(rsync將使用正常、非追加的
"--inplace"模式重發文件)。
-d, --dirs
以不遞歸的方式拷貝目錄本身,它不會拷貝目錄中的文件。不像"--recursive"選項,只拷貝
目錄中的內容而不拷貝目錄本身。除非目錄名中使用了"."或者以斜線結尾(如".","dir/.",
"dir/"等)。既不指定該選項,也不指定"--recursive"選項時,rsync將忽略所有遇到的目錄
(並會向輸出這些影響信息)。如果同時指定了"--dirs"和"--recursive"選項,"--recursive"
將優先生效。
若未給定"--recursive"選項,"--files-from"或"--list-only"選項會隱含"--dirs"選項,此
時在列表中能見到所有目錄。要想關閉此功能,可以指定"--no-dirs"或"--no-d"選項。
還有一個比較有用的向后兼容的選項:"--old-dirs"(--old-d)。它告訴rsync使用
"-r --exclude='/*/*'"僅列出目錄而不遞歸。
-l, --links
當遇到符號鏈接時,將在目標路徑重新創建符號鏈接。(譯者注:即拷貝符號鏈接本身)
-L, --copy-links
使用該選項時,當遇到符號鏈接時將拷貝它所指向的目標而不是符號鏈接本身(譯者加:但僅
只是追蹤了鏈接文件指向文件中的數據,文件名仍然是符號鏈接文件的文件名。舉個例子,
如果client端a文件-->b文件,則使用該選項拷貝a時,將在receiver端生成a文件,但a文件
是一個普通文件,其中的數據來源是client端b文件的數據)。老版本的rsync使用該選項還會
告訴接收端也追蹤符號鏈接到其指向的目標中。在目前的rsync版本中,要實現這樣的功能需
要指定"--keep-dirlinks"(-K)選項。
--copy-unsafe-links
This tells rsync to copy the referent of symbolic links that point outside the
copied tree. Absolute symlinks are also treated like ordinary files, and so are
any symlinks in the source path itself when --relative is used. This option has
no additional effect if --copy-links was also specified.
--safe-links
This tells rsync to ignore any symbolic links which point outside the copied tree.
All absolute symlinks are also ignored. Using this option in conjunction with
--relative may give unexpected results.
-k, --copy-dirlinks
該選項使得sender端將符號鏈接視為一個目錄,就像它真的是一個目錄一樣。如果你不想讓指
向非目錄的符號鏈接受到影響,可以使用該選項。
Without this option, if the sending side has replaced a directory with a symlink
to a directory, the receiving side will delete anything that is in the way of the
new symlink, including a directory hierarchy (as long as --force or --delete is
in effect).
See also --keep-dirlinks for an analogous option for the receiving side.
--copy-dirlinks applies to all symlinks to directories in the source. If you want
to follow only a few specified symlinks, a trick you can use is to pass them as
additional source args with a trailing slash, using --relative to make the paths
match up right. For example:
rsync -r --relative src/./ src/./follow-me/ dest/
This works because rsync calls lstat(2) on the source arg as given, and the
trailing slash makes lstat(2) follow the symlink, giving rise to a directory in
the file-list which overrides the symlink found during the scan of "src/./".
-K, --keep-dirlinks
該選項使得receiver端將符號鏈接視為目錄文件,就像它是真的目錄一樣,但只有它在sender
端能匹配一個真實目錄時才會如此。不使用該選項,receiver端的符號鏈接將被刪除或替換為
一個真實目錄。
例如,假設你要傳輸一個包含文件"file"的目錄"foo",但是在receiver端上的"foo"是一個指
向"bar"目錄的符號鏈接。如果不使用該選項,receiver端將刪除符號鏈接"foo",然后重建它
為一個目錄,然后接收"file"到此目錄中。如果使用了該選項,receiver端將保留符號鏈接,
然后將"file"存放到"bar"目錄中去。
(譯注:上述示例的命令格式為"rsync -r foo user@host:/path",其中path下有個名為foo
的鏈接文件)
需要注意一點:如果使用了"--keep-dirlinks",你必須信任你所有拷貝中的鏈接文件。如果
某個非信任用戶要創建屬於它自己的符號鏈接(指向某目錄),在下一次傳輸過程中,可能會使
用真實目錄替換掉符號鏈接並影響鏈接文件所指向目錄中的文件內容。對於備份拷貝,你最好
是用mount的bind功能而不是使用符號鏈接來改變接收端的目錄層次。
參見"--copy-dirlinks"選項,它是在sender端上類似的選項。
-H, --hard-links
This tells rsync to look for hard-linked files in the source and link together
the corresponding files on the destination. Without this option, hard-linked
files in the source are treated as though they were separate files.
This option does NOT necessarily ensure that the pattern of hard links on the
destination exactly matches that on the source. Cases in which the destination
may end up with extra hard links include the following:
o If the destination contains extraneous hard-links (more linking than what
is present in the source file list), the copying
algorithm will not break them explicitly. However, if one or more of the
paths have content differences, the normal file-update process will break
those extra links (unless you are using the --inplace option).
o If you specify a --link-dest directory that contains hard links, the
linking of the destination files against the --link-dest files can
cause some paths in the destination to become linked together due to
the --link-dest associations.
Note that rsync can only detect hard links between files that are inside the
transfer set. If rsync updates a file that has extra hard-link connections to
files outside the transfer, that linkage will be broken. If you are tempted to
use the --inplace option to avoid this breakage, be very careful that you know
how your files are being updated so that you are certain that no unintended
changes happen due to lingering hard links (and see the --inplace option for
more caveats).
If incremental recursion is active (see --recursive), rsync may transfer a
missing hard-linked file before it finds that another link for that contents
exists elsewhere in the hierarchy. This does not affect the accuracy of the
transfer (i.e. which files are hard-linked together), just its efficiency (i.e.
copying the data for a new, early copy of a hard-linked file that could have
been found later in the transfer in another member of the hard-linked set of
files). One way to avoid this inefficiency is to disable incremental recursion
using the --no-inc-recursive option.
-p, --perms
該選項告訴receiver端的rsync,要將目標文件的權限值設置為何源文件一樣(即權限保留)。
(參見"--chmod"選項以獲取rsync修改sender端權限的方式)
當沒有使用該選項時,將以如下方式設置權限值:
o 已存在的文件繼續保留它們的原有權限,盡管"--executability"選項可能會改變文
件的執行權限。
o 對於新文件,將從源文件中獲取普通權限值,再配合receiver端文件所在目錄的默認
ACL權限或umask值決定文件的最終權限,並且會禁用它們的特殊權限位,除非新的目
錄文件從其父目錄中繼承了sgid權限。
因此,當"--perms"和"--executability"選項都被禁用時,rsync的行為和其它文件拷貝工具
的行為一樣,例如cp、tar。
總結以下:要設置目標文件(包括新文件和已存在的舊文件)的權限值為源文件的權限值,使用
"--perms"選項。要設置新的目標文件默認權限,請確保"--perms"選項是關閉的,然后使用
"--chmod=ugo=rwX"(這將保證啟用所有非掩碼位權限)。如果想以更簡單的方式實現后一種情
況,你可能需要為其定義一個popt別名,例如將下面的命令行放入文件~/.popt中(下面的命令
中定義了"-Z"選項,並使用了"--no-g"使得目標文件的所屬組使用目標目錄的默認組):
rsync alias -Z --no-p --no-g --chmod=ugo=rwX
然后可以在命令行中使用新的選項,例如:
rsync -avZ src/ dest/
(警告:請確保"-a"選項不是跟隨在"-Z"后的,否則將重新啟用上面已經定義的兩個"--no-*"
選項。)
-E, --executability
該選項使得rsync在未指定"--perms"選項時對普通文件保留文件的執行權限(或者不可執行權
限)。普通文件上開啟了"x"才認為有可執行權限。當目標文件已存在且和對應源文件的可執
行權限值不一樣時,rsync將采用如下方式修改權限:
o To make a file non-executable, rsync turns off all its ’x’ permissions.
o To make a file executable, rsync turns on each ’x’ permission that has a
corresponding ’r’ permission enabled.
如果指定了"--perms"選項,則該選項被忽略。
-A, --acls
使目標文件的ACL屬性和源文件的ACL屬性一致。該選項隱含了"--perms"選項。
-X, --xattrs
使目標文件的擴展屬性和源文件的擴展屬性保持一致。
--chmod
該選項使得rsync可以將目標文件的權限設定為此處所指定的權限值,讓rsync以為這些指定
的權限就是源文件的權限。也因此在未配合"--perms"一起使用時該選項無效。
在chmod(1)的man文檔中記錄了普通的語法解析規則,你可以通過加上一個前綴"D"來指定該
權限規則只對目錄有效,或者加上前綴"F"指定該權限規則只對普通文件有效。例如,下面的
例子保證了所有目錄都標記了sgid權限,其它人對文件都不可寫,所有者和所屬組都可寫,
且所有人都有執行權限:
--chmod=Dg+s,ug+w,Fo-w,+X
可以指定多個使用逗號分隔的"--chomod"選項。
-o, --owner
該選項使得rsync將目標文件的所有者設置為和源文件一樣(即保留所有者屬性),但要求接收
端的rsync是以super user身份運行的(或指定了"--no-super"選項)。如果不指定該選項,目
標文件的所有者將設置為調用rsync的用戶身份(譯者注:例如rsync /src name1@host:/path,
則目標文件的所有者為name1)。
默認情況下,目標文件的所有者名稱由uid匹配而來,但在某些環境下,可能會保留使用uid。
(詳細信息見"--numeric-ids"選項)
(譯者注:例如源文件的所有者為name1,其uid=1000,那么將在目標主機上尋找uid=1000所
對應的用戶名,如果能找到則所有者設置為用戶名,否則設置為uid=1000)
-g, --group
此選項的意義完全同"--owner",所以不做對應翻譯。
--devices
該選項使得rsync可以傳輸字符設備和塊設備到目標主機上以重新創建這些設備。該選項要求
接收端的rsync是以super user身份運行的(譯者注:例如,root用戶也算是super user,則
rsync /devicename root@host:/path),否則該選項失效。(見"--super"和"--fake-super"
選項)
--specials
該選項使得rsync可以傳輸特殊文件,如命名套接字,命名管道等。
-D 該選項等價於"--devices --specials"選項組合。
-t, --times
該選項告訴rsync將mtime隨文件一起傳輸給receiver,使得目標文件的mtime和源文件一樣。
千萬注意,如果不指定該選項,原本排除那些mtime相同的文件而獲得的性能提升將不再生
效;換句話說,如果沒有在rsync命令行中使用"-t"或"-a"選項,將導致下一次傳輸以類似於
"-I"的方式進行,即更新所有文件(盡管在文件沒有真正發生更改的情況下,rsync的增量傳
輸算法可以讓更新效率很高,但最好還是使用"-t")
-O, --omit-dir-times
該選項告訴rsync,當保留mtime(見"--times")時,將忽略目錄。如果receiver端正在通過
NFS共享目錄,使用"-O"是一個不錯的選擇。若指定了"--backup"但未指定"--backup-dir",
將隱含該選項。
--super
該選項告訴receiver端在進行某些操作時嘗試使用super-user身份,盡管receiver端的rsync
不是以super user身份運行的。這些操作包括:通過"--owner"保留文件所有者,通過
"--groups"保留文件所屬組(包括輔助組),通過"--devices"選項拷貝設備文件。在receiver
端未以super user身份調用rsync時,這些選項很有用。如果要關閉super user選項功能,則
使用"--no-super"
--fake-super
如果啟用了該選項,rsync將通過對附加在每個文件上的擴展屬性(根據實際需要)的保存/恢復
來模擬super user。擴展屬性包括:文件的owner、group、文件的設備信息(設備文件和特殊
文件被創建為空文本文件)以及所有特殊權限位(suid/sgid/sbit)。
在不使用super user備份數據時但又想保存ACL屬性時,該選項很有用。
"--fake-super"選項默認只影響命令發起端,如果想要通過遠程shell影響遠程端時,可以指
定rsync的路徑:
rsync -av --rsync-path="rsync --fake-super" /src/ host:/dest/
由於本地拷貝時,兩端都在本地主機上,該選項將會同時影響本地的sender端和receiver端
的文件。如果想要避免這樣的情況,需要通過指定"localhost"的地址方式來實現拷貝,或者
可能也可以使用"lsh"遠程shell來完成。
該選項會被"--super"以及"--no-super"選項覆蓋。
其他信息可以參見rsyncd.conf文件中的"fake super"。
-S, --sparse
嘗試以高效率的方式處理稀疏文件,使得它們在目標主機上占用更少的空間。該選項不能和
"--inplace"選項一起使用,因為"--inplace"不能向稀疏模式的文件中覆蓋數據。
-n, --dry-run
該選項使得rsync僅測試運行(並生成和真正運行時幾乎一樣的輸出信息)。該選項常和"-v"、
"--verbose"、"-i"、"--itemize-changes"選項一起使用,以便查看rsync在這些選項下是如
何工作的。
配合"--itemize-changes"時的輸出結果應該要和真正運行的結果完全一致(除非人為故意欺
騙rsync或系統調用失敗)。如果輸出結果不一致,則出現了bug。配合其他幾個選項時,輸出
結果除了在某些方面外應該保持幾乎一致。尤其是,dry run不會真的發送數據,因此
"--progress"將的結果將很可能異常。
-W, --whole-file
使用該選項將使得rsync不再使用增量傳輸算法,而是傳輸所有文件。如果源和目標主機之間
的帶寬高於磁盤的帶寬(特別是"磁盤"是網絡文件系統時),則該選項比增量傳輸更有效。當
源和目標都是本地時,該選項是默認的傳輸算法,但若受到write batch模式影響,則此算法
不生效。
(譯者注:假設A主機和B主機之間的網絡可以以1000MB/s的速度傳輸,而目標主機B上磁盤的
帶寬只有500MB/s,顯然目標主機在文件重組時從basis file讀取數據塊的速度不如A發送給
B快,所以在這種情況下,增量傳輸不如全量傳輸)
-x, --one-file-system
該選項告訴rsync不能跨文件系統遞歸(譯者注:例如根目錄下有mnt目錄,mnt常用來做掛載
點,則遞歸根目錄時,不會遞歸到mnt里面)。該選項不會限制用戶從多個文件系統指定拷貝
項,僅只是限制rsync在每個目錄下進行遞歸,同時也以類似的限制方式限制刪除時receiver
端遞歸。需要記住,使用mount命令的"bind"功能綁定了設備文件時,它也被認為是在同一個
文件系統上。
如果重復指定該選項,rsync將忽略client端所有的掛載點目錄。否則,當遇到掛載點時將當
作是空目錄(這些空目錄使用已掛載目錄的屬性,因為掛載點目錄下的文件是無法訪問的)。
如果指定了"--copy-links"或"--copy-unsafe-links"選項使得rsync"瓦解"符號鏈接,則符
號鏈接所指向的是另一個設備上的目錄時將和掛載點一樣對待。該選項不會影響指向非目錄
的符號鏈接。
(譯者注:翻譯有點不標准,以下是原文)
This tells rsync to avoid crossing a filesystem boundary when recursing. This does
not limit the user’s ability to specify items to copy from multiple filesystems,
just rsync’s recursion through the hierarchy of each directory that the user
specified, and also the analogous recursion on the receiving side during deletion.
Also keep in mind that rsync treats a "bind" mount to the same device as being on
the same filesystem.
If this option is repeated, rsync omits all mount-point directories from the copy.
Otherwise, it includes an empty directory at each mount-point it encounters
(using the attributes of the mounted directory because those of the underlying
mount-point directory are inaccessible).
If rsync has been told to collapse symlinks (via --copy-links or
--copy-unsafe-links), a symlink to a directory on another device
is treated like a mount-point. Symlinks to non-directories are
unaffected by this option.
--existing, --ignore-non-existing
告訴rsync,如果目標主機上文件或文件所在目錄還不存在,則不自動創建它們,即這些文件
將不被傳輸。如果該選項和"--ignore-existing"選項一起使用,將不更新任何文件(如果你
的目的是刪除目標主機上的無關文件,這將非常有用)。
(譯者注:例如rsync --existing /etc/dhcp/* /tmp,由於/tmp下沒有dhcp目錄,所以dhcp
目錄和其中的文件都不會被傳輸到/tmp下)
該選項屬於一種transfer rule,而不是exclude rule,因此不會影響進入file list的文件,
也因此不會影響刪除操作。該選項僅對receiver所請求要傳輸的文件進行了限制。
--ignore-existing
該選項告訴rsync忽略對目標主機上已存在的文件的更新(不會忽略已存在的目錄,或者什么
也不做)。見"--existing"選項說明。
該選項屬於一種transfer rule,而不是exclude rule,因此不會影響進入file list的文件,
也因此不會影響刪除操作。該選項僅對receiver所請求要傳輸的文件進行了限制。
對於使用了"--link-dest"選項做備份時,碰巧備份被中斷,如果想繼續完成備份,則該選項
有用。因為"--link-dest"選項會拷貝到一個新的目錄層次中,使用"--ignore-existing"將
保證已存在的文件不會被調整。這意味着該選項僅盯着目標上已存在的文件不放。
--remove-source-files
該選項告訴rsync移除sender端已經成功傳輸到receiver端的文件(不包括任何目錄文件)。
--delete
該選項告訴rsync刪除receiver端有而sender端沒有的文件,但不是刪除receiver端所有文件,
而是只對將要同步的目錄生效。你需要明確指定整個目錄(如"dir"或"dir/")而不是使用通配
符來通配目錄的內容(如"dir/*"),因為通配符會被shell進行擴展,使得rsync被請求傳輸單
個文件而非文件的父目錄。被exclude排除的文件也會從delete中排除掉,除非使用了
"--delete-excluded"選項或者標記了只對sender端匹配上的文件有效(見篩選規則中的
include/exclude修飾符)。
(譯者注:由於exclude規則先生效,delete時認為源端不存在而目標端存在,使得delete也
想要刪除這些被排除的文件,但默認情況下,在刪除時對這些被排除的文件加上了保護規則,
所以這些文件無法被delete掉,這是一個容易疑惑的地方。要刪除這些被排除的文件,只需
使用選項"--delete-excluded"選項將這些被保護的文件強制取消保護)
(譯者注:(1)不會刪除receiver端任何目錄,即使是子目錄也不刪除;(2)delete動作是由
generator進程執行的)
該選項如果錯誤使用將是非常危險的!強烈建議先使用"--dry-run"(-n)進行測試,以確定將
刪除那些文件。
如果sender端探測到了任何i/o錯誤,將自動禁用遠程刪除功能。這是為了防止sender端的臨
時文件系統故障(如NFS錯誤)導致大規模刪除目標文件。可以指定"--ignore-errors"選項強
制忽略任何I/O錯誤。
"--delete"選項一般可能會配合"--delete-WHEN"的某一種或"--delete-excluded",它們不
會沖突。但若未指定任何"--delete-WHEN"時,rsync將默認采用"--delete-during"算法。
(譯者注:即在generator啟動后,每處理一個文件列表,就刪除該文件列表中需要刪除的文
件,在處理某個文件列表時不會刪除別的文件列表中的文件,其實這一點從"-vvvv"的結果中
很容易獲取到)
--delete-before
請求在傳輸開始前執行目標文件刪除行為。該選項隱含了"--delete"選項。
(譯者注:傳輸之前刪除指的在處理所有文件列表之前先刪除所有文件列表中指定要刪除的
文件,也就是說在generator剛啟動時立即刪除所有文件列表中待刪除文件,而默認的
--delete則是在generator剛啟動時刪除第一個文件列表中的待刪除文件)
在傳輸之前執行刪除對於文件系統空間緊俏時是很有幫助的。但是,由於它會在傳輸開始之
前發起一段延遲,這一段延遲很可能會使得傳輸超時(如果指定了"--timeout"選項),還會
強制rsync使用老的、非增量的遞歸算法,此算法要求rsync將所有傳輸中的文件一次性掃描
到內存中。
--delete-during, --del
請求receiver端的文件刪除行為是隨着文件傳輸時逐步執行的。隱含了"--delete"選項。
(譯者注:"--delete"沒有和"--delete-WHEN"同時使用時,"--delete"默認采用的就是
"--delete-during")
--delete-delay
請求receiver端的文件刪除行為在所有文件列表中的文件都全部傳輸完成后才刪除。在結
合"--delay-updates"、"--fuzzy"選項一起使用時比較有用,並且相比"--delete-after"
來說效率更高。
--delete-after
請求receiver端的文件刪除行為在所有文件列表中的文件都全部傳輸完成后才刪除。和
"--delete-delay"不同的是,該選項會采用老的、非增量傳輸的算法將傳輸中的所有文件
一次性掃描到內存中,因此效率不高。
--delete-excluded
為了刪除sender端沒有而receiver端有的文件,可以指定該選項告訴rsync即使文件被
"--exclude"排除了,也要在遠程將其刪除。
--ignore-errors
告訴"--delete",即使在遇到I/O錯誤時也要繼續。
--force
該選項告訴rsync,當某個非空目錄要被非目錄文件替換時,將此非空目錄刪除掉。這只有
在刪除行為未激活時才有效。
--max-delete=NUM
限制rsync最多能刪除NUM個文件或目錄,如果突破了該限制,將輸出警告信息並以狀態碼
25退出。
可以使用"--max-delete=0"來保證不會在遠程刪除任何文件,因為只要有刪除行為,就會
警告並退出。
--max-size=SIZE
限制rsync傳輸的最大文件大小。可使用單位后綴,還可以是一個小數值(例如:
"--max-size=1.5m")。
該選項是一個傳輸規則,而不是排除規則,因此不會影響文件進入文件列表,也因此不會影
響刪除行為。它僅僅只是限制了receiver端請求傳輸的文件。
有如下可用后綴:"K"("KiB")=1024字節、"M"("MiB")、"G"("GiB")。如果想使用1000作為
換算單位,則使用KB、MB、GB。(注意,所有大寫字母都可以使用小寫字母替換)。最后,如
果后綴以"+1"或"-1"結尾,則值表示減小或增大一個字節。
例如:"--max-size=1.5mb-1"表示1499999字節,"--max-size=2g+1"表示2147483649字節。
--min-size=SIZE
限制rsync傳輸的最小文件大小。這可以用於禁止傳輸小文件或那些垃圾文件。單位的指定
方法同"--max-size"。
-B, --block-size=BLOCKSIZE
該選項強制修改rsync算法將文件划分為數據塊時的塊大小。一般基於正在更新的文件來選
擇大小值。詳細信息見技術報告。
(譯者注:rsync算法的作者說塊大小在500-1000時是比較好的選擇。對於超過1M的文件絕對
不要讓塊大小低於500,否則性能極低。)
-e, --rsh=COMMAND
該選項允許你選擇用於本地和遠程之間的通信的遠程shell程序。一般情況下,rsync默認配
置為使用ssh,但如果在本地網絡上,你可能更喜歡使用rsh。
如果該選項和格式[user@]host::module/path一起使用,則該遠程shell命令會在遠程主機
上啟動一個rsync daemon(譯者注:可以認為是臨時模
擬的rsync daemon進程),並且所有數據都將通過此遠程shell的連接傳輸,而不是通過網絡
套接字所連接的遠程主機上的rsync daemon。見上文"通過遠程SHELL連接使用RSYNC-DAEMON
特性"。
允許在COMMAND中提供多個遠程shell參數,它們將會作為一個整體傳遞給rsync。多個參數
必須使用空格(不能是制表符tab或其他任意空白字符),分隔,也可以使用單引號或雙引號
包圍參數來保護空格(但不能使用反斜線)。注意在單引號字符串內部使用多個單引號將返
回給你一對單引號,同理,雙引號也一樣(盡管你需要注意哪些引號是shell來解析的,哪
些引號是rsync解析的)。例如:
-e 'ssh -p 2234'
-e 'ssh -o "ProxyCommand nohup ssh firewall nc -w1 %h %p"'
(注意,可以在用戶家目錄下的.ssh/config文件中自定義ssh的連接選項。)
你也可以使用RSYNC_RSH環境變量指定遠程shell程序,它能接受和"-e"選項一樣的值。
另外請查看會影響該選項的"--blocking-io"選項。
--rsync-path=PROGRAM
指定遠程機器上要運行的程序以啟動遠程rsync進程。當遠程rsync程序不在默認目錄
/usr/local/bin/rsync下常會使用該選項指定其路徑。但要注意,PROGRAM是在shell
的幫助下運行的,因此它可以是任意程序、腳本或你想運行的命令序列,只要它們不
會破壞rsync正在使用的標准輸入和標准輸出即可。
一個很棘手的例子是在遠程機器上設置不同的默認目錄以便使用"--relative"選項。例如:
rsync -avR --rsync-path="cd /a/b && rsync" host:c/d /e/
(譯者注:以上示例將會在本地主機創建/e/c/d,其中c/d數據來源於遠程主機的/a/b/c/d)
-C, --cvs-exclude
這是一個很有用的簡寫排除文件法,用於排除大量不希望在系統之間傳輸的文件。它使用了
類似於CVS的算法來決定一個文件是否要被忽略。
exclude列表被初始化為排除以下格式的文件(這些初始化條目被標記為易過期,見后文"篩
選規則"段落的說明):
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo
*~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o
*.obj *.so *.exe *.Z *.elc *.ln core .svn/ .git/ .hg/ .bzr/
然后,$HOME/.cvsignore文件中的文件列表將會被添加到此exclude列表,此外還會包含
CVSIGNORE環境變量中指定的所有文件(所有cvsignore名稱由空白字符分隔)
最后,和.cvsignore文件在同一個目錄中的文件,如果它們能匹配此文件中列出的規則,則
也會被排除。不像rsync的篩選/排除規則,這些匹配模式是使用空白字符分隔的。更多cvs
的模式見cvs(1)的man文檔。
如果將"-C"選項結合"--filter"規則,需要記住,無論"-C"選項處於命令行的哪些位置,這
些cvs排除規則都將會追加在你所指定的規則之后。這就使得"-C"選項指定的規則比你自行
指定的規則優先級耕地。如果你想將CVS規則插入到你的篩選規則中的某個位置,那么就不
要使用"-C"選項,而是使用一種結合方式:"--filter:C"或"--filter=-C"。前者啟用
.cvsignore文件中的規則進行每目錄掃描,后者則是一次性導入所有上面說所的CVS規則。
-f, --filter=RULE
該選項可以讓你添加規則,以便從待傳輸的文件列表中有選擇性地排除某些文件。在遞歸傳
輸中,結合該選項是非常有用的。
你可以在命令行中使用任意多個"--filter"選項以建立要排除的文件列表。如果篩選規則中
包含了空白字符,需要使用引號包圍以防被shell解析。在下文中同樣介紹了如何使用下划
線替代空格來分隔rsync參數和規則。
該選項的詳細信息請參見"篩選規則"段落說明。
-F 該選項是一種添加到"--filter"規則的簡寫法,只有兩種可能:第一種是單個"-F"選項,此
時它是以下規則的簡寫:
--filter='dir-merge /.rsync-filter'
這告訴rsync查找那些分散在目錄結構中的所有.rsync-filter文件,然后使用這些規則篩選
出傳輸中的文件。第二種是如果重復使用"-F"選項,則它是以下規則的簡寫:
--filter='exclude .rsync-filter'
該規則將從傳輸中篩選出.rsync-filter本身。
關於該選項如何工作的更詳細信息,見"篩選規則"段落說明。
--exclude=PATTERN
該選項是"--filter"選項的簡化格式,默認為排除(exclude)規則,並且它將禁止對普通的
篩選規則進行解析。
更詳細信息見"篩選規則"段落說明。
--exclude-from=FILE
該選項和"--exclude"選項類似,但是它是從包含了排除規則的文件中讀取排除規則(每行一
個規則)。空行以及";"或"#"開頭的行為注釋行,如果給定的文件為"-",則表示從標准輸入
中讀取排除規則。
--include=PATTERN
該選項是"--filter"選項的簡化格式,默認為包含(include)規則,並且它將禁止對普通的
篩選規則進行語法解析。
更詳細信息見"篩選規則"段落說明。
--include-from=FILE
該選項和"--exclude"選項類似,但是它是從包含了排除規則的文件中讀取排除規則(每行一
個規則)。空行以及";"或"#"開頭的行為注釋行,如果給定的文件為"-",則表示從標准輸入
中讀取排除規則。
--files-from=FILE
該選項可以在FILE中精確指定要傳輸的文件列表。如果FILE為"-"則表示從標准輸入中讀取
文件列表。它還調整了rysnc的默認行為以便能夠更簡單地指定要傳輸的文件:
o 它隱含了"--relative"(-R)選項,所以會保留在文件中每個條目所指定的路徑信息。
(使用"--no-relative"或"--no-R"關閉該功能)
o 它隱含了"--dirs"(-d)選項,所以將在目標主機上創建列表中指定的目錄而不是悄
悄地跳過它們。(使用"--no-dirs"或"--no-d"關閉該功能)
o "--archive"(-a)將不再隱含"--recursive"(-r),因此如果真的要遞歸到目錄中,
需要顯式指定"--recursive"(-r)。
o 它的副作用是改變了rsync的默認狀態,因此"--files-from"選項在命令行中的位置
和其它選項的解析無關(例如,"-a"選項放在"--files-from"選項的前后的工作方式
是一樣的)。
從FILE中讀取的所有文件名都是相對於源目錄的相對路徑,任何前導斜線都會被移除,也
無法使用".."進入源目錄的上一層次目錄。例如:
rsync -a --files-from=/tmp/foo /usr remote:/backup
如果/tmp/foo中包含了字符串"bin"或"/bin",將在遠程主機上創建/backup/bin作為
/usr/bin所對應的目標文件。如果包含了字符串"bin/"(注意尾隨斜線),則將傳輸
/usr/bin目錄以及其內的文件。如果指定了"-r"選項,則所有目錄結構都會被傳輸
(要記住當使用了"--files-from"時,"-r"選項需要顯式指定,因為"-a"選項不再隱
含該選項)。還要注意,適用"--files-from"時,"--relative"選項的默認行為是僅
復制從文件中讀取的路徑信息,不再強制復制原規范路徑(即此示例中的/usr)
另外,"--files-from"的文件可以從遠程主機上讀取,而不一定要從本地主機上讀取,
需只在文件的前面指定"host:"即可。要求"host:"的host必須是rsync兩端的某一端,
為了簡寫,可以使用簡寫的前綴":"表示遠端主機。例如:
rsync -a --files-from=srchost:/path/file-list srchost:/ /tmp/copy
rsync -a --files-from=:/path/file-list srchost:/ /tmp/copy
這將會拷貝在遠程主機"srchost"上/path/file-list文件中指定的所有文件。
注意:對"--files-from"的文件進行排序可以使得rsync效率更高,因為它將使得rsync不
用再重新讀取相鄰能共用的路徑元素。如果不進行排序,則rsync可能會多次重新掃描路徑
元素(隱含目錄),重復生成文件列表。
-0, --from0
告訴rsync從文件中讀取規則或文件名時是以空字符(\0)終止的。該選項會影響
"--exclude-from"、"--include-from"、"--files-from"以及所有在"--filter"
中指定的規則合並文件。它不會影響"--cvs-exclude"(因為從.cvsignore文件中
讀取的名稱都是以空白字符分隔的)。
-s, --protect-args
該選項將使得所有發送給遠程rsync進程的文件名和大多數選項都不允許被遠程shell解析。
這意味着空格不再分隔文件名,任意非通配特殊字符都不會被翻譯(即成為普通字符,
如:~、$、;、&等)。通配字符將被遠程主機上的rsync擴展(正常情況下是由遠程shell來
擴展的)。
-T, --temp-dir=DIR
該選項明確receiver端文件重組時的臨時目錄。默認情況下,receiver端將在文件所在目
錄中創建臨時文件。
在receiver端,如果目標文件所在磁盤分區剩余大小不足以存儲待重組文件時,可以使用
該選項將臨時文件存儲到其他的分區中,在這種情況下,由於創建的臨時文件和目標路徑
不在同一個分區上,所以重組完成時無法直接重命名,而是只能從臨時目錄中拷貝到目標
路徑下。
如果你使用該選項的原因不是磁盤空間不足,你可能要將此選項結合"--delay-updates"選
項一起使用,這將保證所有拷貝的文件都放入目標層次結構的子目錄中,並等待傳輸結束。
-y, --fuzzy
該選項告訴rsync,如果目標主機上的basis file缺失,將主動搜索出一個文件作為basis
file。目前的算法是在同一目錄中模糊搜索目標basis file,搜索的規則是:要么文件大小
和修改時間完全一致,要么文件名相似。如果搜索到了符合條件的文件,rsync將使用該文
件作為basis file,這樣可能會加速傳輸速度。
(譯者注:在目標主機上進行文件重組時,會從basis file中拷貝匹配塊,在真正的basis
file缺失時,模糊搜索出的basis file可能能提供一些匹配塊,從而減少sender要發送的
數據量,加快整個同步過程)
注意,如果使用了"--delete"選項,可能會把潛在的basis file給刪除掉,因此要想避免
種這情況,可以指定"--delete-after"選項,或者直接指定文件名來排除將被刪除的文件。
--compare-dest=DIR
該選項指示rsync使用目標主機上的DIR作為額外的層次結構,以便和傳輸中的文件做比較
(如果目標目錄中不存在basis file)。如果在DIR中發現了和sender端完全一致的文件,則
該文件將不會傳輸到目標目錄中。該選項在做稀疏備份時很有用,因為它僅備份從某一次
更早的備份開始發生了改變的文件。(譯者注:以備份目錄為比較目錄DIR,同步時將比較
該目錄中的文件,最終將僅傳輸發生了改變的文件到目標目錄下)
從rsync 2.6.4版本開始,可以通過多個"--compare-dest"選項提供多個比較目錄,使得
rsync可以按照為了精確匹配而指定的順序來搜索列表。如果發現能匹配上但僅只有屬性不
同,將生成一個本地副本然后更新這些屬性信息。如果未能匹配上,將選擇DIRs中的basis
file來提高傳輸速度。
如果DIR是相對路徑,它將是相對於目標目錄的。見"--copy-dest"和"--link-dest"。
--copy-dest=DIR
該選項類似於"--compare-dest",但rsync會從DIR中以本地拷貝的方式拷貝未改變的文件
到目標目錄中。
可以通過多個"--copy-dest"選項提供多個DIR,使得rsync可以按照為了匹配未修改文件的
順序來搜索列表。如果未匹配上,則選擇DIR中的basis file以嘗試提高傳輸速度。
如果DIR是相對路徑,它將是相對於目標目錄的。見"--copy-dest"和"--link-dest"。
--link-dest=DIR
This option behaves like --copy-dest, but unchanged files are hard linked from
DIR to the destination directory. The files must be identical in all preserved
attributes (e.g. permissions, possibly ownership) in order for the files to be
linked together. An example:
rsync -av --link-dest=$PWD/prior_dir host:src_dir/ new_dir/
If file’s aren’t linking, double-check their attributes. Also check if some
attributes are getting forced outside of rsync’s control, such a mount option
that squishes root to a single user, or mounts a removable drive with generic
ownership (such as OS X’s "Ignore ownership on this volume" option).
Beginning in version 2.6.4, multiple --link-dest directories may be provided,
which will cause rsync to search the list in the order specified for an exact
match. If a match is found that differs only in attributes, a local copy is
made and the attributes updated. If a match is not found, a basis file from
one of the DIRs will be selected to try to speed up the transfer.
This option works best when copying into an empty destination hierarchy, as
rsync treats existing files as definitive (so it never looks in the link-dest
dirs when a destination file already exists), and as malleable (so it might
change the attributes of a destination file, which affects all the hard-linked
versions).
Note that if you combine this option with --ignore-times, rsync will not
link any files together because it only links identical files together as
a substitute for transferring the file, never as an additional check after
the file is updated.
If DIR is a relative path, it is relative to the destination directory. See
also --compare-dest and --copy-dest.
Note that rsync versions prior to 2.6.1 had a bug that could prevent --link-dest
from working properly for a non-super-user when -o was specified (or implied
by -a). You can work-around this bug by avoiding the -o option when sending to
an old rsync.
-z, --compress
使用該選項,rsync將對發送給目標主機的文件數據(file data)進行壓縮,這可以減少傳輸
的數據量——在某些緩慢的連接中可能比較適用。
注意,該選項一般情況下可以實現比通過遠程shell壓縮或傳輸過程壓縮獲得更好的壓縮比,
因為它利用了明確不通過連接發送的匹配數據塊中的隱含信息。
請通過"--skip-compress"選項確定不被壓縮的默認文件后綴列表。
--compress-level=NUM
顯式指定"--compress"的壓縮級別。如果NUM為非零值,則該選項將隱含"--compress"。
--skip-compress=LIST
該選項通過指定后綴格式來決定哪些文件不被壓縮。LIST的值為使用斜杠"/"分隔的一個或
多個文件后綴(不包括點.)
如果LIST指定的是空字符串,則表示壓縮所有文件。
支持簡單的字符類匹配。所謂的字符類由中括號和寫在中括號中的一系列的字母組成(如:
非特殊的字符類[abcz],特殊的字符類[:alpha:],注意,短橫線"-"在此沒有特殊的意義,
僅表示一個簡單的字符)。
注意,字符"*"和"?"沒有特殊的意義。
例如此處示例指定了6個不壓縮的后綴(因為其中一個規則mp[34]匹配了兩種后綴):
--skip-compress=gz/jpg/mp[34]/7z/bz2
默認不被壓縮的后綴列表為:(不同版本的rsync可能會有些微改變)
7z avi bz2 deb gz iso jpeg jpg mov mp3 mp4 ogg rpm tbz tgz z zip
該后綴列表將會被"--skip-compress"選項指定的后綴列表覆蓋,但有一種情況例外:以
rsync daemon為源拷貝文件時,rsync將在不被壓縮的文件列表中增加你指定的后綴文件(
並且該文件列表可能會被配置為非默認情況)(譯者注:也就是說,當從rsync daemon拷貝
時,指定的壓縮忽略后綴不是覆蓋原壓縮忽略列表,而是追加到原壓縮忽略列表)。
--numeric-ids
使用該選項后,rsync將傳輸gid和uid,而不是字符格式的username和groupname然后將其
映射到兩端。
默認情況下,rsync將使用用戶名和組名來決定如何設置文件的所有者和所屬組。但要注
意,即使沒有指定"--numeric-ids"選項,也絕不會通過字符格式的username和groupname
來映射特殊的uid=0和gid=0。
如果在源主機上的用戶或組沒有字符格式的名稱(譯注:即只有uid和gid,沒有username
和groupname),或者目標主機上沒有相同的用戶/組,則將使用uid/gid來設置所有權關系。
請參看rsyncd.conf的man文檔中關於"use chroot"的設置說明,以獲取關於chroot設置后
如何影響rsync對用戶名和組名的查找能力以及你能對此做些什么。
--timeout=TIMEOUT
該選項設置的是最大IO超時時間,單位為秒。如果在指定時間內沒有數據被傳輸,則rsync
將直接退出。默認值為0表示永不超時。
--contimeout
該選項設置rsync成功連接rsync daemon的等待超時時間。若在指定時間內未連接上rsync
daemon,rsync將以錯誤方式退出。
--address
默認當rsync連接rsync daemon時,rsync所使用的地址將會綁定到通配符地址上(譯注:默
認通配符地址為0.0.0.0,即可以從任意接口的任意地址上向外發起連接)。使用該選項可以
明確指定rsync要綁定的IP地址或主機名。請同樣參見"--daemon"模式中"--address"選項獲
取詳細信息。
--port=PORT
該選項可以顯式指定一個要使用的tcp端口號而不是默認的873端口。該選項只能在連接rsync
daemon時的雙冒號(::)的語法格式中使用(因為URL rsync://user@host:port/語法本身就可
以指定端口號,所以不需要該選項明確指定)。請同樣參見"--daemon"模式中"--port"選項獲
取詳細信息。
--sockopts
這個選項可以為希望最大程度地調整系統的人們提供無窮樂趣。你可以設置各種套接字選項
使得傳輸速度更快(或更慢!)。關於該選項的可設置項請閱讀setsockopt()系統調用man文
檔。默認情況下,該選項沒有設置任何值。該選項只影響使用套接字連接rsync daemon的情
況。在"--daemon"模式中也有該選項。
--blocking-io
該選項告訴rsync在啟動遠程shell傳輸時使用阻塞I/O模型。如果遠程shell為rsh或remsh,
rsync默認使用阻塞I/O,否則默認將使用非阻塞I/O。(注意,ssh更適合使用非阻塞I/O)
-i, --itemize-changes
請求輸出一個明細列表,這個列表記錄的是每個文件發生了哪些改變,包括屬性的改變。它
完全等價於"--out-format='%i %n%L'"。如果重復該選項,未發生改變的文件也會被輸出。
因為幾乎不用,所以不做翻譯。
--out-format=FORMAT
該選項允許你自定義rsync client對每個更新過程產生輸出的信息格式。指定的格式為"%"
加一個單字符。如果指定了"-v"選項,則其默認的格式為"%n%L"(將輸出文件名,如果是一
個鏈接文件,則輸出其指向的對象)。完整的格式列表,見rsyncd.conf的man文檔中"log
format"段落。
指定"--out-format"是對每個文件、目錄等都輸出信息的。
rsync將在文件傳輸之前輸出這些信息,除非請求輸出傳輸過程中的統計信息,這樣它會在
文件傳輸結束前輸出信息,在這種情況下如果同時指定了"--progress"選項,rsync將會同
時輸出正在傳輸中的文件名。
--log-file=FILE
請求將輸出信息記錄到文件中。類似於"--out-format"。它可以指定記錄client以及非
daemon的server端的日志。若在客戶端的命令行上指定該選項,則默認格式為"%i %n%L"。
以下是一個請求遠端來記錄日志的示例:
rsync -av --rsync-path="rsync --log-file=/tmp/rlog" src/ dest/
該選項對於調試非預期的連接關閉比較有用。
--log-file-format=FORMAT
該選項指定要在"--log-file"文件中記錄的日志格式(當然,需配合"--log-file"才生效)。
如果FORMAT指定為空,將不會記錄更新的文件信息。完整的格式列表,見rsyncd.conf的
man文檔中"log format"段落。
--stats
該選項讓rsync打印文件傳輸過程中的詳細統計數據,從中可以看出增量算法的效率如何。
統計數據包括如下幾項:
o Number of files是所有"文件"的數量總數,包含目錄、字符鏈接等。
o Number of files transferred是普通文件通過rsync增量傳輸算法更新的數據大小,
它不包括創建的目錄、字符鏈接等非文件數據。
o Total file size是傳輸中所有文件總大小。該大小不會計算目錄和特殊文件大小,
但會包含字符鏈接的大小。
o Total transferred file size是所有已傳輸文件的總大小。
o Literal data是所有非匹配數據塊的數據大小,即傳輸給receiver端的純文件數據
大小。
o Matched data是所有匹配塊的數據總大小,即receiver端從basis file中拷貝的數
據大小。
o File list size是sender發送給receiver端的文件列表大小。它比內存中文件列表的
內容要小很多,因為sender將其傳輸給receiver端的時候會將其進行壓縮。
o File list generation time是sender創建文件列表消耗的時間,單位為秒。老版本
的rysnc可能不會輸出該項。
o File list transfer time是sender將文件列表發送給receiver端消耗的時間,單位秒。
o Total bytes sent是rsync從sender端傳輸給receiver端的所有數據大小,單位字節。
(譯者注:包括純文件數據,信息數據等等非文件數據)
o Total bytes received是receiver端收到的所有非信息數據大小,單位字節。
-8, --8-bit-output
告訴rsync在輸出信息中保留所有高位字符不進行轉義。幾乎用不上,所以不做翻譯。
-h, --human-readable
以人類可讀方式輸出信息。如果只指定單個該選項,則K/M/G的轉換單位為1000,指定多次,
則轉換單位為1024。
--partial
默認rsync在傳輸中斷時會刪除只傳輸了一部分不完整文件(partial file)。在某些環境下,
可能希望保留這些已傳輸的部分。"--partial"選項告訴rsync保留這些部分,這可以使得下
一次傳輸只傳輸剩余部分,從而加快傳輸速度。
--partial-dir=DIR
比直接使用"--partial"更好的做法是指定一個存放不完整數據(partial file)的目錄DIR,
下次再傳輸時,rsync將使用一個文件來尋找到該DIR中的文件,以便提高傳輸速率,當數據
真正傳輸完整且傳輸真正完成后,該DIR將被刪除。
注意,如果指定了"--whole-file"選項(后者隱含了該選項),則所有的"partial-dir"中正
在更新的文件都會被刪除,因為rsync此時沒有使用增量傳輸算法來傳輸文件。
rsync如果發現DIR不存在,則自動創建(但不是遞歸創建整個目錄路徑),這使得rsync在需
要時能更方便地使用相對路徑在文件所在目錄下直接創建partial-dir
(例如"--partial-dir=.rsync-partial"),並且在partial file被刪除時自動移除該目錄。
如果partial-dir的值不是一個絕對路徑,rsync將在所有exclude規則尾部追加一個exclude
規則,用於防止partial file已經存在於sender端,也能防止receiver端過早刪除partial
file。例如:"--partial-dir"將在其他篩選規則的尾部添加一個等價於
"-f 'P .rsync-partial/'"的規則。
如果你正在使用自定義的exclude規則,你可能需要在你的exclude/hide/protect規則中添
加partial-dir相關的條目,因為(1)向其他規則的尾部自動添加規則的行為可能會失效(2)
你可能希望覆蓋rsync的排除選擇。例如,如果你想讓rsync清除被隨意亂放置的剩余partial
file,需要指定"--delete-after"並且添加一條"risk"篩選規則,如
"-f 'R .rsync-partial/'"(不要使用"--delete-before"或"--delete-during",除非你不想
讓rsync使用剩余的partial file來完成此次傳輸)。
重要:"--partial-dir"目錄不能讓其他用戶可寫,否則有安全隱患。例如避免使用"/tmp"。
你也可以通過環境變量"RSYNC_PARTIAL_DIR"來設置partial-dir的值。設置該環境變量不會
強制開啟"--partial",但在指定了"--partial"時會影響它的partial-dir路徑。例如,不
再讓"-partial-dir=.rsync-tmp"隨同"--progress"一起使用,而是設置
"RSYNC_PARTIAL_DIR=.rsync-tmp",然后只需使用"-P"選項來應用".rsync-tmp"目錄以完成
partial傳輸。只有在以下情況下"--partial"不會查找該環境變量的值:
(1)使用了選項"--inplace"(因為"--inplace"和"--partial-dir"選項沖突)
(2)使用了選項"--delay-updates"(見下文)。
--delay-updates
該選項將receiver端每個重組的臨時文件保留在某個目錄中,直到傳輸結束之前才一次性將
它們全部重命名為各自對應的目標文件。這樣的行為使得所有文件的更新更具有原子性
(譯注:如果你了解數據庫事務,就知道原子性是什么意思,最直白地說,具有原子性表示
要么全部成功,要么全部失敗,所以這里更新具有原子性表示要么全部更新成功,要么全部
更新失敗,但由於重命名覆蓋目標文件后是不可回滾的,所以這里的原子性並不是那么的嚴
格)。默認情況下,這些臨時文件將放在每個目標文件所在目錄下的".~tmp~"子目錄下,但
如果指定了選項"--partial-dir",那么將使用該選項指定的目錄。請參見"--partial-dir"
選項獲取相關信息。該選項和"--inplace"以及"--append"選項沖突。
該選項使得receiver端使用更多的內存空間,並且需要更多的磁盤空間以存儲額外的目標文
件副本。需要注意,"--partial-dir"不能使用絕對路徑,除非你能保證傳輸中的文件沒有
同名文件(因為如果使用了絕對路徑,所有的臨時文件都放在那一個目錄下,重名文件會先
后覆蓋),且在目錄層次結構中沒有掛載點(因為如果無法重命名到指定路徑下,延遲更新將
失敗)
-m, --prune-empty-dirs
該選項告訴receiver端的rsync從文件列表中刪除空目錄,包括那些沒有文件的空的嵌套目
錄。這對於避免創建一堆無用的目錄很有用,例如在sender端使用include/exclude/filter
規則掃描遞歸層次時會創建所有層次的目錄。
注意傳輸規則(如"--min-size")不會影響文件進入文件列表,因此不會讓目錄成為空目錄,
即使目錄中沒有任何文件可以匹配上傳輸規則。
由於該選項會修剪file list,所以會影響delete對目錄的刪除行為。但記住,exclude排除
的文件和目錄可以防止現有條目被刪除,因為排除規則既隱藏了源文件,又保護了目標文件。
可以使用全局"protect"篩選規則防止file list中的某個特定目錄被修剪。例如,下面的選
項可以保證目錄"emptydir"仍然保留在file list中:
--filter ’protect emptydir/’
以下的示例可以從一個層次結構中拷貝其中所有的.pdf文件,並且只在目標主機上創建必
要的目錄來存放這些.pdf文件,並會移除目標上所有多余文件和目錄(注意此處使用了非目
錄文件的hide篩選規則替代exclude規則):
rsync -avm --del --include=’*.pdf’ -f ’hide,! */’ src/ dest
若不想刪除目標主機上多余文件,可使用更古老的選項"--include='*/' --exclude='*'"
替代hide篩選規則,不過你不一定能適應它,畢竟它是古老的選項。
--progress
該選項告訴rsync顯示傳輸進度信息,這是給那些無聊的用戶看的。它隱含了"--verbose"。
如果rsync正在傳輸的是一個普通文件,將以下面格式顯示進度信息:
782448 63% 110.64kB/s 0:00:04
在此例中,receiver重組了sender發送的文件的782448字節的數據或者說重組了該文件的
63%(譯者注:此處的意思是這些數據是文件的純數據,不包括那些非文件信息類數據),且
以110.64kB/s的速率重建文件,如果保持該速率,該文件將在4秒后重建完成。
若使用的是rsync的增量拷貝算法,那么這些統計數據可能會誤導用戶。例如,如果sender
的文件由basis file和另一段放在basis file前面的數據組成,那么當reciever在獲取純文
件數據時,此處所顯示的速率值會急劇下降,而且要完成傳輸可能會比估計的時間更長,因
為它還要處理匹配的數據塊部分。(譯者注:換句話說,該進度信息是sender發送的純數據
相關信息,和真正完成同步的進度沒有直接關系)
當文件傳輸完成,rsync將使用總結性的行替代進度信息,類似格式如下:
1238099 100% 146.38kB/s 0:00:08 (xfer#5, to-check=169/396)
此示例中,文件大小為1238099字節,整體傳輸平均速率是146.38kB/s,總共消耗了8秒才傳
輸完成。"xfer#5"表示此文件是該rsync會話期間第5個傳輸的文件,"to-check=169/396"表
示此次傳輸的文件列表中共要檢查396個文件,其中有169個文件待檢查以確定它們是否需要
傳輸。
(譯者注:可以認為396是某些文件被排除后待考慮是否傳輸的總文件數,196則是還剩下196
個文件還未檢查)
-P 該選項等價於"--partial --progess"選項。指定這兩個選項的目的是為了讓某一次可能會
中斷的較長傳輸過程變得更簡單。
--password-file
該選項讓rsync在連接rsync daemon時從密碼文件中獲取密碼。密碼文件必須可讀。該文件
中只有第一行是rsync將讀取的密碼,其他所有行都自動忽略。
該選項無法為遠程shell(如ssh)提供密碼,至於如何為遠程shell提供密碼,參考對應遠程
shell的文檔(譯者注:對於ssh而言,使用公鑰認證機制即可)。當使用遠程shell訪問rsync
daemon時,該選項只有完成了遠程shell的身份驗證過程才生效。
--list-only
該選項強制rsync僅列出源路徑的文件列表而不是進行文件傳輸。如果rsync命令行中只給出
了一個地址,將隱含該選項。注意通配符會被shell解析並擴展為rsync的參數。例如:
rsync -av --list-only foo* dest/
--bwlimit=KBPS
該選項對rsync的傳輸最大速度進行限速。該限制值是一個平均值,所以在實際傳輸過程中
可能會短暫的超出該限制值。設置為0則表示不限速。
--write-batch=FILE
記錄一個稍后被"--read-batch"讀取的文件,該文件可被用於另一個完全一致的目標路徑。
詳細信息見"批處理模式"段落信息。
(譯者注:通俗地說,就是將源和目標的不同點記錄下來保存在FILE中,然后通過
"--read-batch"讀取這些不同點並更新目標文件,如果有多台目標主機上的文件情
況是完全一致的,則可以通過此FILE一次性應用於所有這些主機,因此稱之為"批
處理模式"。注意,FILE中不僅記錄了不同之處,還記錄了將要應用於目標主機的
數據部分,因此它是一個"信息+數據"文件而不僅僅只是小小的信息文件)
--only-write-batch=FILE
和"--write-batch"工作方式類似,區別是當生成batch file的時候不會對目標路徑做
任何操作。這使得你可以通過某些方法將所發生改變的信息傳輸到目標系統上,然后通
過"--read-batch"應用這些改變。
可以直接將批處理文件FILE保存到任意的移動存儲設備中。
注意,只有向遠程主機推送這些改變時才能節省帶寬,因為這樣可以讓sender端的數據分
流記錄到FILE中,而無需通過連接傳輸給receiver端。(如果是拉取數據,則sender端為
remote,因此無法寫批處理文件FILE)
--read-batch=FILE
讀取所有通過"--write-batch"生成的批處理文件FILE並通過其中的"信息+數據"應用於目
標主機。如果FILE未"-",則批處理數據將從標准輸入中讀取。
--protocol=NUM
強制指定要使用的協議版本。一般只在創建批處理文件以兼容老版本rsync時可能會用上,
因此不做翻譯。
--iconv=CONVERT_SPEC
rsync可以在不同字符集間轉換文件名。基本用不會上,因此不做翻譯。
-4, --ipv4 or -6, --ipv6
限制rsync使用ipv4還是ipv6創建套接字。該選項由於明確表示了要用網絡套接字,也就限
制了只有連接rsync daemon時才生效。
如果編譯rsync時沒有將ipv6的功能編譯進去,則"--ipv6"無效。通過"--version"的輸出
結果可以知道是否編譯了ipv6功能。
--checksum-seed=NUM
指定checksum的種子長度。默認種子長度為4字節,應用於每個數據塊級和文件級checksum
的計算。默認checksum的種子由server和其默認的當前系統時間time()計算生成。該選項顯
示指定特定的checksum種子,對應想要重復計算塊級或文件級checksum時或者用戶想要一個
更具隨機性的checksum種子時比較有用。設置NUM為0將導致rsync使用默認的time()來計算
種子。
DAEMON OPTIONS
當啟動rsync daemon時,可以指定以下幾個選項:
--daemon
該選項告訴rsync以daemon方式運行。
可以在client端使用host::module or rsync://host/module/格式的命令來訪問daemon。
如果標准輸入是一個套接字,則rsync被認為是通過inetd方式運行的,否則它將從當前終
端上分離出來並成為后台守護進程。每次和daemon進行連接時,daemon都會讀取配置文件
(rsyncd.conf)並給出對應的相應。更詳細信息見rsyncd.conf的man文檔。
--address
rsync daemon的綁定地址,默認會綁定在通配地址上(默認為0.0.0.0)。使用"--address"
選項可以顯式指定要綁定的IP地址或主機。可以配合"--config"一起使用來實現rsync虛
擬主機的功能。更多信息見rsyncd.conf的man文檔中"address"段落說明。
--bwlimit=KBPS
該選項對rsync的傳輸最大速度進行限速。該限制值是一個平均值,所以在實際傳輸過程中
可能會短暫的超出該限制值。設置為0則表示不限速。
--config=FILE
該選項用於指定額外的配置文件來代替默認的配置文件,只有和"--daemon"選項同時使用
時才有效。默認daemon的配置文件為/etc/rsyncd.conf,除非是通過遠程shell啟動的臨時
daemon,使用遠程shell連接的daemon的默認配置文件是當前目錄(一般是$HOME)下的
rsyncd.conf。
--no-detach
當以daemon形式運行時,該選項表示rsync不從終端中將自己分離出來,所以工作在前台。
在各種daemon管理工具如daemontools、systemd上需要使用。如果rsync是由sshd或inetd
派生出來的話,則該選項無效。
--port=PORT
指定daemon的監聽端口,默認為873。
--log-file=FILE
該選項告訴rsync daemon使用此處指定的日志文件替代配置文件中"log file"指定的日志
文件。
--log-file-format=FORMAT
該選項告訴rsync daemon使用此處指定的日志格式而不是配置文件中"log format"指定的
日志格式。該選項會自動開啟"transfer logging",除非它的值為空,因為這樣表示關閉
transfer logging功能。
--sockopts
指定套接字選項,將覆蓋配置文件配置的套接字選項。
-v, --verbose
該選項輸出rsync daemon啟動時的詳細信息。它不控制客戶端和daemon連接時的信息詳細
程度,因為這些信息詳細程度是由client和模塊配置段中的"max verbosity"控制的。
-4, --ipv4 or -6, --ipv6
告訴rsync使用IPV4還是IPV6創建套接字,然后rsync daemon將監聽在對應的地址類型上。
如果編譯rsync時沒有將ipv6的功能編譯進去,則"--ipv6"無效。通過"--version"的輸出
結果可以知道是否編譯了ipv6功能。
-h, --help
如果該選項指定在"--daemon"選項之后,則輸出rsync daemon可用選項的簡短幫助信息。
FILTER RULES
(譯者注:下面篩選規則的內容很多地方都提到了"傳輸中根目錄"(transfer-root)的概念,所以提前
在此做個解釋。假設執行rsync -r /www/lvm /www/audit remote_host:/path命令,則待傳輸的目錄
lvm和audit稱為傳輸過程中的根目錄,即頂級目錄)
篩選規則可以彈性定義哪些文件需要傳輸(include)(譯者注:前文中出現的傳輸規則指的就是
include規則),以及哪些文件需要跳過(exclude)。這些規則要么直接指定include/exclude匹配
模式,要么指定一種方式從中獲取include/exclude匹配模式(例如從文件中讀取規則)。
對於已經創建好的file list中的文件或目錄,rsync會按先后順序對其中的每一個名稱檢查是否
能匹配incluee/exclude規,且先匹配上的規則生效:如果能匹配上exclude規則,則該文件被跳
過,如果該文件能匹配include或不能匹配任何規則,則不挑過該文件。
rsync會按照命令行中指定的篩選規則建立一個有序的規則列表。篩選規則語法如下:
RULE [PATTERN_OR_FILENAME]
RULE,MODIFIERS [PATTERN_OR_FILENAME]
你可以選擇使用下面所描述的長格式或短格式的RULE名稱。如果使用短格式命名的的rule,則分隔
RULE和MODIFIERS中間的","是可選的。其后的PATTERN或FILENAME必須跟在單個空格或下划線(_)之
后。以下是規則前綴:
exclude, - 指定排除規則。
include, + 指定包含規則。
merge, . 指定一個從中讀取更多規則的merge-file。
dir-merge, : 指定一個每目錄的merge-file。
hide, H 指定傳輸過程中需要隱藏的文件。(譯者注:exclude的本質就是hide,該類型的
規則顯然只作用於sender端,下面的"S"同樣如此)
show, S 指定不被隱藏的文件。(譯者注:include的本質就是show)
protect, P 指定保護文件不被刪除的規則。
(譯者注:--delete和--exclude同時使用時,會對被排除的文件加上保護規則。該
類型的規則顯然只作用於receiver端,下面的"R"同樣如此)
risk, R 指定不被保護的文件,即能被刪除的文件。(譯者注:"--delete-excluded"就是
將被保護的文件強制取消保護)
clear, ! 清空當前include/exclude規則列表。(不帶任何參數)
如果是從一個文件中讀取規則,將忽略空行以及使用"#"開頭的注釋行。
注意,使用了"--include"或"--exclude"選項后,將不再解析上述所說的規則序列,只允許使用
"!"表示清空include/exclude規則。如果匹配模式不是使用"- "(減號加一個空格)或"+ "(加號加
一個空格)開頭,則規則將被認為是在字符串的前面加了"+ "(即包含規則)或"- "(即排除規則)前
綴。實際上"--filter"選項的規則字符串中必須在字符串開頭包含短名稱或長名稱的規則。
同時需要注意的是,每個"--filter"、"--include"以及"--exclude"選項都只表示一條規則,如
果要使用多條規則,你可以重復使用這些選項,或者使用"--filter"選項的merge-file語法,又
或者是"--include-from"、"--exclude-from"選項。
INCLUDE/EXCLUDE PATTERN RULES
你可以使用"+"、"-"等規則名稱來指定包含和排除文件的規則,以及其他的規則。每個include、
exclude規則都會對應一個匹配模式用於匹配將要傳輸
的文件名。匹配模式有以下幾種格式:
o 如果匹配模式以斜線(/)開頭,它表示錨定層次結構中某個特定位置的文件,否則將表示匹
配路徑名的結尾。這有點類似於正則表達式中的行首"^"。因此"/foo"匹配的是"傳輸中根
目錄"(transfer-root)下的"foo"文件,或者是merge-file目錄中的"foo"文件。對於不做
限制的"foo"匹配模式,由於算法會從頂部開始向下逐層遞歸,所以它能匹配任意位置名為
"foo"的文件。但是對於非錨定的"sub/foo"模式,將匹配層次結構中位於sub目錄下的foo。
對於如何指定匹配根"/"的模式見"ANCHORING INCLUDE/EXCLUDE PATTERNS"的段落說明。
o 若匹配模式以斜線(/)結尾,將只匹配目錄,而不匹配普通文件、字符鏈接以及設備文件。
o rsync通過檢查匹配模式中是否包含"*"、"?"以及"["符號來決定做簡單的字符串匹配還是
通配符匹配。
o 單個"*"匹配任意路徑元素,但在遇到斜線時終止匹配。
o "**"匹配任意路徑元素,與"*"不同的是,它能匹配斜線。
o "?"匹配任意非斜線的單個字符。
o "["表示字符類匹配,例如"[a-z]",[[:alpha:]]。
o 在通配匹配模式中,反斜線(\)可以對通配符號進行轉義,但如果不是對通配符號使用反斜
線,則它僅僅只是一個普通的反斜線字符。
o 如果匹配模式中包含了一個"/"(不包括以斜線結尾的情況)或"**",則表示對包括前導目錄
的全路徑進行匹配。如果匹配模式中不包括"/"或"**",則表示只對全路徑尾部的路徑元素
進行匹配。(注意:使用了遞歸功能時,"全路徑"可能是從最頂端開始向下遞歸的某中間一
段路徑)。
o 對於"dir_name/***"來說,它將匹配dir_name下的所有層次的文件。
注意,當使用"--recursive"(-r)選項(-a隱含該選項)時,每個子路徑元素會自頂向下逐層,
被訪問因此include/exclude匹配模式會對每個子路徑元素的全路徑名進行遞歸(例如,要包
含"/foo/bar/baz",則"/foo"和"/foo/bar"必須不能被排除)。實際上,排除匹配模式在發現
有文件要傳輸時,此文件所在目錄層次的排除遍歷會被短路。如果排除了某個父目錄,則更
深層次的include模式匹配將無效,因為rsync從排除的那個父目錄位置開始不會再向下遍歷。
這在使用尾隨"*"時尤為重要。例如,下面的例子不會正常工作:
+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *
由於父目錄"some"被規則"*"所排除,所以會失敗,rsync絕不會訪問"some"或"some/path"中的任
何文件。一種解決方式是請求包含層次結構中的所有目錄,只需使用一個規則"+ */"(需放在"- *"
規則的前面)即可,可能還需要使用"--prune-empty-dirs"選項。另一解決方式是為所有需要被訪
問的父目錄
增加特定包含規則。例如,下面的規則可以正常工作:
+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *
以下是一些exclude/include規則匹配模式:
o "- *.o"將排除所有文件名能匹配"*.o"的文件。
o "- /foo"將排除"傳輸中根目錄"(transfer-root)下名為"foo"的文件或目錄。
o "- foo/"將排除所有名為"foo"的目錄。
o "- /foo/*/bar"將排除"傳輸中根目錄"(transfer-root)下"foo"目錄再向下兩層的"bar"文件。
o "- /foo/**/bar"將排除transfer-root下"foo"目錄再向下遞歸任意層次后名為"bar"的文件。
(譯者注:"**"匹配任意多個層次的目錄)
o 同時使用"+ */"、"+ *.c"和"- *",將只包含所有目錄和C源碼文件,除此之外的所有文件
和目錄都被排除。(參見選項"--prune-empty-dirs")
o 同時使用"+ foo/"、"+ foo/bar.c"和"- *"將只包含"foo"目錄和"foo/bar.c"。("foo"目錄
必須顯式包含,否則將被排除規則"- *"排除掉)
以下是"+"或"-"后可接的修飾符:
o "/"指定include/exclude規則需要與當前條目的絕對路徑進行匹配。例如,"-/ /etc/passwd"
將在任意傳輸/etc目錄中文件時刻都排除passwd文件。而對於"-/ subdir/foo"規則,當傳輸
"subdir"目錄中文件時,將總是排除"foo"文件,即使"foo"文件可能是在transfer-root中的。
o "!"指定如果模式匹配失敗,則include/exclude規則生效。例如,"-! */"將排除所有非目錄
文件。(譯者注:反向匹配的意思,"- */"規則是排除所有目錄,那些非目錄文件就匹配不上,
加上"!",即"-! */",則表示匹配不上的這些非目錄文件被匹配上)
o "C"表示將所有的全局CVS排除規則插入到普通排除規則中,而不再使用"-C"選項來插入。其后
不能再接其他參數。
o "s"表示規則只應用於sender端。當某規則作用於sender端時,它可以防止文件被傳輸。默認
情況下,所有規則都會作用於兩端,除非使用了"--delete-exclude"選項,這樣規則將只作用
於sender端。請參見"hide"(H)和"show"(S)規則,這是指定sender端include/exclude規則的
另一種方式。
o "r"表示規則只應用於receiver端。當規則作用於receiver端,它可以防止文件被刪除。更多
信息見上面的"s"修飾符。另請參見"P"和"R"規則,它們是指定receiver端include/exclude
規則的另一種方式。
o "p"表示此規則是易過期的,這意味着將忽略正在被刪除的目錄。例如,"-C"選項的默認規則
是以CVS風格進行排除,且"*.o"文件會被標記為易過期,這將不會阻止在源端移除的目錄在
目標端上被刪除。
(譯者注:也就是說在源端刪除的目錄在目標端上也會被刪除。以下是原文,翻譯也許有誤)
A p indicates that a rule is perishable, meaning that it is ignored in directories
that are being deleted. For instance, the -C option’s default rules that exclude
things like "CVS" and "*.o" are marked as perishable, and will not prevent a
directory that was removed on the source from being deleted on the destination.
MERGE-FILE FILTER RULES
你可以通過指定"."將某文件中的規則合並在規則集合中,或指定":"(dir-merge)將目錄下文件中
的規則合並在規則集合中。
有兩種合並文件的方式:單實例合並"."和每目錄合並":"。單實例合並文件僅讀取一次,其中的規
則被合並到篩選列表中替代"."所代表的規則。對於每目錄合並文件,rsync將掃描每個目錄以遍歷
指定名稱的規則文件,並合並規則文件中的內容到當前規則列表中。每目錄合並的規則文件必須創
建在sender端,因為會掃描sender端來決定哪些文件要被傳輸。如果想讓規則文件作用於receiver
端不想被刪除的文件,則需要將規則文件傳輸到receiver端(見下面的"PER-DIRECTORY RULES AND
DELETE")。
一些示例:
merge /etc/rsync/default.rules
. /etc/rsync/default.rules
dir-merge .per-dir-filter
dir-merge,n- .non-inherited-per-dir-excludes
:n- .non-inherited-per-dir-excludes
以下是單實例合並"."和每目錄合並":"后可接的修飾符:
o "-"表示規則文件中只有exclude規則,可以在文件中使用注釋行。
o "+"表示規則文件中只有include規則,可以在文件中使用注釋行。
o "C"指定的是CVS分格的規則。它將會開啟"n"、"w"和"-",也允許指定規則列表清空修飾符
"!"。若不提供任何文件名,則默認為".cvsignore"。
o "e"表示排除合並文件使其不被傳輸。
例如"dir-merge,e .rules"等價於"dir-merge .rules"+"- .rules"。
o "n"表示規則不被子目錄繼承。
o "w"表示規則是使用空白符號分隔的而不是默認的換行符。顯然,這種方式下合並文件中不
能使用注釋行。
注意:分隔規則前綴的空格是有特殊意義的,例如"- foo + bar"會被解析為兩條規則。
o 此外,你可能還需要指定上文所述的"+"、"-"規則的修飾符,以便對這些從文件中讀取的規
則具有修飾符集(除了"!"修飾符)。例如"merge,-/ .excl"將把".excl"文件中的內容視為絕
對路徑排除,而"dir-merge,s .filt"和":sC"都將使得所有每目錄規則僅作用於sender端。
每目錄合並規則會被所有的子目錄繼承,除非指定了"n"修飾符。每個子目錄的規則會置放在繼承
規則的前面,使得最新的規則比繼承的規則有更高的優先級。整個dir-merge的規則集合會在指定
的merge-file中進行合並,因此可通過前面在全局規則列表中指定的規則來覆蓋dir-merge規則。
當從每目錄文件中讀取到了列表清除規則"!",將僅從當前的合並文件中清除掉繼承規則。
阻止dir-merge中的單個規則被繼承的另一種方式是使用前導斜線(/)進行錨定。每目錄合並規則中
的錨定規則是相對於merge-file目錄的,因此"/foo"將僅匹配從dir-merge規則中找到的目錄中的
"foo"文件。
以下是一個示例,需要指定[--fileter=".file"]:
merge /home/user/.global-filter
- *.gz
dir-merge .rules
+ *.[ch]
- *.o
這將會在規則列表的頭部合並/home/user/.global-file文件中內容,還會合並所有的".rules"文
件中的規則。在目錄掃描開始之前讀取的所有規則都遵循全局錨定規則(例如,前導斜線匹配
transfer-root)。
If a per-directory merge-file is specified with a path that is a parent directory of
the first transfer directory, rsync will scan all the parent dirs from that starting
point to the transfer directory for the indicated per-directory file. For instance,
here is a common filter (see -F):
--filter=': /.rsync-filter'
That rule tells rsync to scan for the file .rsync-filter in all directories from the
root down through the parent directory of the transfer prior to the start of the normal
directory scan of the file in the directories that are sent as a part of the transfer.
(Note: for an rsync daemon, the root is always the same as the module’s "path".)
Some examples of this pre-scanning for per-directory files:
rsync -avF /src/path/ /dest/dir
rsync -av --filter=': ../../.rsync-filter' /src/path/ /dest/dir
rsync -av --filter=': .rsync-filter' /src/path/ /dest/dir
The first two commands above will look for ".rsync-filter" in "/" and "/src" before
the normal scan begins looking for the file in "/src/path" and its subdirectories.
The last command avoids the parent-dir scan and only looks for the ".rsync-filter"
files in each directory that is a part of the transfer.
If you want to include the contents of a ".cvsignore" in your patterns, you should
use the rule ":C", which creates a dir-merge of the .cvsignore file, but parsed in
a CVS-compatible manner. You can use this to affect where the --cvs-exclude (-C)
option’s inclusion of the per-directory .cvsignore file gets placed into your rules
by putting the ":C" wherever you like in your filter rules. Without this, rsync would
add the dir-merge rule for the .cvsignore file at the end of all your other rules
(giving it a lower priority than your command-line rules). For example:
cat < out.dat
then look at out.dat. If everything is working correctly then out.dat should be a
zero length file. If you are getting the above error from rsync then you will probably
find that out.dat contains some text or data. Look at the contents and try to work out
what is producing it. The most common cause is incorrectly configured shell startup
scripts (such as .cshrc or .profile) that contain output statements for non-interactive
logins.
If you are having trouble debugging filter patterns, then try specifying the -vv
option. At this level of verbosity rsync will show why each individual file is
included or excluded.
ENVIRONMENT VARIABLES
CVSIGNORE
The CVSIGNORE environment variable supplements any ignore patterns in .cvsignore
files. See the --cvs-exclude option for more details.
RSYNC_ICONV
Specify a default --iconv setting using this environment variable.
(First supported in 3.0.0.)
RSYNC_RSH
The RSYNC_RSH environment variable allows you to override the default shell
used as the transport for rsync. Command line options are permitted after
the command name, just as in the -e option.
RSYNC_PROXY
The RSYNC_PROXY environment variable allows you to redirect your rsync
client to use a web proxy when connecting to a rsync daemon. You should
set RSYNC_PROXY to a hostname:port pair.
RSYNC_PASSWORD
Setting RSYNC_PASSWORD to the required password allows you to run authenticated
rsync connections to an rsync daemon without user intervention. Note that this
does not supply a password to a remote shell transport such as ssh; to learn
how to do that, consult the remote shell’s documentation.
USER or LOGNAME
The USER or LOGNAME environment variables are used to determine the default
username sent to an rsync daemon. If neither is set, the username defaults to
"nobody".
HOME The HOME environment variable is used to find the user’s default .cvsignore
file.
FILES
/etc/rsyncd.conf or rsyncd.conf
SEE ALSO
rsyncd.conf(5)
VERSION
This man page is current for version 3.0.9 of rsync.
INTERNAL OPTIONS
The options --server and --sender are used internally by rsync, and should never
be typed by a user under normal circumstances. Some awareness of these options may
be needed in certain scenarios, such as when setting up a login that can only run
an rsync command. For instance, the support directory of the rsync distribution has
an example script named rrsync (for restricted rsync) that can be used with a
restricted ssh login.