Ubuntu 12.04でローカルにこの同期を行っています。通常、ファイルは小さなテキストファイル(コード)です。
source
ディレクトリからtarget
にコピー(mtimeスタンプを保持)したいが、target
にあるファイルのみコピーしたいすでに存在するおよびis oldersource
のものよりもです。
したがって、私は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
の別のスイッチ--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)