Rsync

同步文件的最佳方式 - 僅複製現有文件且僅在比目標更新時

  • April 26, 2018

我在 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)

引用自:https://unix.stackexchange.com/questions/117190