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是一種版本控制系統,其餘版本控制系統如git、svn) 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判斷文件是否要傳輸時)ios
-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 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, giv‐ ing 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. With‐ out 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 direc‐ tory 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"' (Note that ssh users can alternately customize site-specific connect options in their .ssh/config file.) 你也可使用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 con‐ trol, 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 des‐ tination 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端。 Per-directory rules are inherited in all subdirectories of the directory where the merge-file was found unless the 'n' modifier was used. Each subdirectory's rules are prefixed to the inherited per-directory rules from its parents, which gives the newest rules a higher priority than the inherited rules. The entire set of dir-merge rules are grouped together in the spot where the merge-file was specified, so it is possible to override dir-merge rules via a rule that got specified earlier in the list of global rules. When the list-clearing rule ("!") is read from a per-directory file, it only clears the inherited rules for the current merge file. Another way to prevent a single rule from a dir-merge file from being inherited is to anchor it with a leading slash. Anchored rules in a per-directory merge-file are relative to the merge-file's directory, so a pattern "/foo" would only match the file "foo" in the directory where the dir-merge filter file was found. Here's an example filter file which you'd specify via --filter=". file": merge /home/user/.global-filter - *.gz dir-merge .rules + *.[ch] - *.o This will merge the contents of the /home/user/.global-filter file at the start of the list and also turns the ".rules" filename into a per-directory filter file. All rules read in prior to the start of the directory scan follow the global anchoring rules (i.e. a leading slash matches at the root of the transfer). 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 trans‐ fer 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 com‐ mand-line rules). For example: cat <<EOT | rsync -avC --filter='. -' a/ b + foo.o :C - *.old EOT rsync -avC --include=foo.o -f :C --exclude='*.old' a/ b Both of the above rsync commands are identical. Each one will merge all the per-directory .cvsignore rules in the middle of the list rather than at the end. This allows their dir-specific rules to supersede the rules that follow the :C instead of being subservient to all your rules. To affect the other CVS exclude rules (i.e. the default list of exclusions, the contents of $HOME/.cvsignore, and the value of $CVSIGNORE) you should omit the -C command-line option and instead insert a "-C" rule into your filter rules; e.g. "--fil‐ ter=-C". LIST-CLEARING FILTER RULE(清空篩選規則列表) You can clear the current include/exclude list by using the "!" filter rule (as introduced in the FILTER RULES section above). The "cur‐ rent" list is either the global list of rules (if the rule is encountered while parsing the filter options) or a set of per-directory rules (which are inherited in their own sub-list, so a subdirectory can use this to clear out the parent’s rules). ANCHORING INCLUDE/EXCLUDE PATTERNS(INCLUDE/EXCULDE匹配模式的錨定行爲) As mentioned earlier, global include/exclude patterns are anchored at the "root of the transfer" (as opposed to per-directory patterns, which are anchored at the merge-file’s directory). If you think of the transfer as a subtree of names that are being sent from sender to receiver, the transfer-root is where the tree starts to be duplicated in the destination directory. This root governs where patterns that start with a / match. Because the matching is relative to the transfer-root, changing the trailing slash on a source path or changing your use of the --rela‐ tive option affects the path you need to use in your matching (in addition to changing how much of the file tree is duplicated on the destination host). The following examples demonstrate this. Let’s say that we want to match two source files, one with an absolute path of "/home/me/foo/bar", and one with a path of "/home/you/bar/baz". Here is how the various command choices differ for a 2-source transfer: Example cmd: rsync -a /home/me /home/you /dest +/- pattern: /me/foo/bar +/- pattern: /you/bar/baz Target file: /dest/me/foo/bar Target file: /dest/you/bar/baz Example cmd: rsync -a /home/me/ /home/you/ /dest +/- pattern: /foo/bar (note missing "me") +/- pattern: /bar/baz (note missing "you") Target file: /dest/foo/bar Target file: /dest/bar/baz Example cmd: rsync -a --relative /home/me/ /home/you /dest +/- pattern: /home/me/foo/bar (note full path) +/- pattern: /home/you/bar/baz (ditto) Target file: /dest/home/me/foo/bar Target file: /dest/home/you/bar/baz Example cmd: cd /home; rsync -a --relative me/foo you/ /dest +/- pattern: /me/foo/bar (starts at specified path) +/- pattern: /you/bar/baz (ditto) Target file: /dest/me/foo/bar Target file: /dest/you/bar/baz The easiest way to see what name you should filter is to just look at the output when using --verbose and put a / in front of the name (use the --dry-run option if you’re not yet ready to copy any files). PER-DIRECTORY RULES AND DELETE Without a delete option, per-directory rules are only relevant on the sending side, so you can feel free to exclude the merge files them‐ selves without affecting the transfer. To make this easy, the ’e’ modifier adds this exclude for you, as seen in these two equivalent commands: rsync -av --filter=': .excl' --exclude=.excl host:src/dir /dest rsync -av --filter=':e .excl' host:src/dir /dest However, if you want to do a delete on the receiving side AND you want some files to be excluded from being deleted, you’ll need to be sure that the receiving side knows what files to exclude. The easiest way is to include the per-directory merge files in the transfer and use --delete-after, because this ensures that the receiving side gets all the same exclude rules as the sending side before it tries to delete anything: rsync -avF --delete-after host:src/dir /dest However, if the merge files are not a part of the transfer, you’ll need to either specify some global exclude rules (i.e. specified on the command line), or you’ll need to maintain your own per-directory merge files on the receiving side. An example of the first is this (assume that the remote .rules files exclude themselves): rsync -av --filter=’: .rules’ --filter=’. /my/extra.rules’ --delete host:src/dir /dest In the above example the extra.rules file can affect both sides of the transfer, but (on the sending side) the rules are subservient to the rules merged from the .rules files because they were specified after the per-directory merge rule. In one final example, the remote side is excluding the .rsync-filter files from the transfer, but we want to use our own .rsync-filter files to control what gets deleted on the receiving side. To do this we must specifically exclude the per-directory merge files (so that they don’t get deleted) and then put rules into the local files to control what else should not get deleted. Like one of these commands: rsync -av --filter=':e /.rsync-filter' --delete \ host:src/dir /dest rsync -avFF --delete host:src/dir /dest BATCH MODE Batch mode can be used to apply the same set of updates to many identical systems. Suppose one has a tree which is replicated on a number of hosts. Now suppose some changes have been made to this source tree and those changes need to be propagated to the other hosts. In order to do this using batch mode, rsync is run with the write-batch option to apply the changes made to the source tree to one of the destination trees. The write-batch option causes the rsync client to store in a "batch file" all the information needed to repeat this operation against other, identical destination trees. Generating the batch file once saves having to perform the file status, checksum, and data block generation more than once when updating multiple destination trees. Multicast transport protocols can be used to transfer the batch update files in parallel to many hosts at once, instead of sending the same data to every host individually. To apply the recorded changes to another destination tree, run rsync with the read-batch option, specifying the name of the same batch file, and the destination tree. Rsync updates the destination tree using the information stored in the batch file. For your convenience, a script file is also created when the write-batch option is used: it will be named the same as the batch file with ".sh" appended. This script file contains a command-line suitable for updating a destination tree using the associated batch file. It can be executed using a Bourne (or Bourne-like) shell, optionally passing in an alternate destination tree pathname which is then used instead of the original destination path. This is useful when the destination tree path on the current host differs from the one used to create the batch file. Examples: $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/ $ scp foo* remote: $ ssh remote ./foo.sh /bdest/dir/ $ rsync --write-batch=foo -a /source/dir/ /adest/dir/ $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo In these examples, rsync is used to update /adest/dir/ from /source/dir/ and the information to repeat this operation is stored in "foo" and "foo.sh". The host "remote" is then updated with the batched data going into the directory /bdest/dir. The differences between the two examples reveals some of the flexibility you have in how you deal with batches: o The first example shows that the initial copy doesn’t have to be local -- you can push or pull data to/from a remote host using either the remote-shell syntax or rsync daemon syntax, as desired. o The first example uses the created "foo.sh" file to get the right rsync options when running the read-batch command on the remote host. o The second example reads the batch data via standard input so that the batch file doesn’t need to be copied to the remote machine first. This example avoids the foo.sh script because it needed to use a modified --read-batch option, but you could edit the script file if you wished to make use of it (just be sure that no other option is trying to use standard input, such as the "--exclude-from=-" option). Caveats: The read-batch option expects the destination tree that it is updating to be identical to the destination tree that was used to create the batch update fileset. When a difference between the destination trees is encountered the update might be discarded with a warning (if the file appears to be up-to-date already) or the file-update may be attempted and then, if the file fails to verify, the update dis‐ carded with an error. This means that it should be safe to re-run a read-batch operation if the command got interrupted. If you wish to force the batched-update to always be attempted regardless of the file’s size and date, use the -I option (when reading the batch). If an error occurs, the destination tree will probably be in a partially updated state. In that case, rsync can be used in its regular (non-batch) mode of operation to fix up the destination tree. The rsync version used on all destinations must be at least as new as the one used to generate the batch file. Rsync will die with an error if the protocol version in the batch file is too new for the batch-reading rsync to handle. See also the --protocol option for a way to have the creating rsync generate a batch file that an older rsync can understand. (Note that batch files changed format in ver‐ sion 2.6.3, so mixing versions older than that with newer versions will not work.) When reading a batch file, rsync will force the value of certain options to match the data in the batch file if you didn’t set them to the same as the batch-writing command. Other options can (and should) be changed. For instance --write-batch changes to --read-batch, --files-from is dropped, and the --filter/--include/--exclude options are not needed unless one of the --delete options is specified. The code that creates the BATCH.sh file transforms any filter/include/exclude options into a single list that is appended as a "here" document to the shell script file. An advanced user can use this to modify the exclude list if a change in what gets deleted by --delete is desired. A normal user can ignore this detail and just use the shell script as an easy way to run the appropriate --read-batch com‐ mand for the batched data. The original batch mode in rsync was based on "rsync+", but the latest version uses a new implementation. 符號連接 當rsync在源目錄中遇到符號連接有3種基本行爲: 默認狀況下,符號連接不會被傳輸。且會提示"skipping non-regular file is emmitted"。 若是指定了"--links"選項,則在目標路徑下建立指向相同對象的符號連接。注意,"--archive"選項隱含了"--links"選項。 (譯者注:即傳輸符號連接自己,若是目標主機上沒有該連接指向的對象,則目標主機上此符號連接是一個損壞的軟連接) 若是指定了"--copy-links"選項,符號連接將"摺疊"(collapsed)其所指向文件的內容並傳輸,而不是傳輸連接自己。 (譯者注:舉個例子,例如源主機符號連接a指向b,若是指定該選項,則在目標主機上會建立文件a,但a不是符號連接,而是普通文件或目錄,其內容 和b中的內容徹底一致,也就是將b中的內容疊進符號連接中。) rsync一樣能夠識別"安全"(safe)和"不安全"(unsafe)連接。可能會在web鏡像站點中使用它們,例如但願保證被拷貝的rsync模塊不包含指向/etc/passwd 的符號連接。使用"--copy-unsafe-links"將致使任何軟連接以其指向的文件進行拷貝,使用"--safe-links"則使得unsafe軟連接徹底被忽略。 (注意:必須指定"--links","--safe-links"選項纔會生效。) 如下是被視爲不安全的符號連接的狀況:路徑是絕對連接(以斜線/開頭)、空連接、路徑中包含".."。 如下是符號連接相關選項的解釋:優先級從高到低排序 --copy-links 將全部符號連接變爲普通文件(全部符號連接相關的其餘選項都不會對此選項產生影響)。 --links --copy-unsafe-links 將全部不安全符號連接編程文件,並複製全部安全符號連接。 --copy-unsafe-links 將全部不安全符號連接變爲文件,但跳過全部安全符號連接。 --links --safe-links 複製全部安全符號連接並跳過不安全符號連接。 --links 複製全部符號連接自己。 DIAGNOSTICS rsync occasionally produces error messages that may seem a little cryptic. The one that seems to cause the most confusion is "protocol version mismatch -- is your shell clean?". This message is usually caused by your startup scripts or remote shell facility producing unwanted garbage on the stream that rsync is using for its transport. The way to diagnose this problem is to run your remote shell like this: ssh remotehost /bin/true > 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 produc‐ ing 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 dae‐ mon. 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.