Rsync
同步文件的最佳方式 - 僅複製現有文件且僅在比目標更新時
我在 Ubuntu 12.04 上進行本地同步。這些文件通常是小型文本文件(程式碼)。
我想從
source
目錄複製(保留 mtime 戳)到,target
但我只想在文件已經target
存在並且比.source
所以我只複製較新的文件
source
,但它們必須存在,target
否則不會被複製。(source
將有比 . 更多的文件target
。)我實際上將復製
source
到多個target
目錄。我提到這一點以防它影響解決方案的選擇。但是,如果需要的話,我可以輕鬆地多次執行我的命令,target
每次都指定新的。
我相信你可以用它
rsync
來做到這一點。關鍵的觀察是需要使用--existing
和--update
開關。--existing skip creating new files on receiver -u, --update skip files that are newer on the receiver
像這樣的命令可以做到這一點:
$ rsync -avz --update --existing src/ dst
例子
假設我們有以下範例數據。
$ mkdir -p src/; touch src/file{1..3} $ mkdir -p dst/; touch dst/file{2..3} $ touch -d 20120101 src/file2
如下所示:
$ ls -l src/ dst/ dst/: total 0 -rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2 -rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3 src/: total 0 -rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1 -rw-rw-r--. 1 saml saml 0 Jan 1 2012 file2 -rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3
現在,如果我要同步這些目錄,什麼都不會發生:
$ rsync -avz --update --existing src/ dst sending incremental file list sent 12 bytes received 31 bytes 406.00 bytes/sec total size is 0 speedup is 0.00
如果我們
touch
是一個源文件,使其更新:$ touch src/file3 $ ls -l src/file3 -rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3
再次執行
rsync
命令:$ rsync -avz --update --existing src/ dst sending incremental file list file3 sent 115 bytes received 31 bytes 292.00 bytes/sec total size is 0 speedup is 0.00
我們可以看到
file3
,因為它是新的,並且它存在於 中dst/
,所以它被發送了。測試
為了確保在你切斷命令之前一切正常,我建議使用另一個
rsync
’s 開關,--dry-run
. 讓我們也添加另一個-v
,這樣rsync
’ 的輸出就更詳細了。$ rsync -avvz --dry-run --update --existing src/ dst sending incremental file list delta-transmission disabled for local transfer or --whole-file file1 file2 is uptodate file3 is newer total: matches=0 hash_hits=0 false_alarms=0 data=0 sent 88 bytes received 21 bytes 218.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)