web-dev-qa-db-ja.com

ファイルを同期する最善の方法-既存のファイルのみをコピーし、ターゲットよりも新しい場合のみ

Ubuntu 12.04でローカルにこの同期を行っています。通常、ファイルは小さなテキストファイル(コード)です。

sourceディレクトリからtargetにコピー(mtimeスタンプを保持)したいが、targetにあるファイルのみコピーしたいすでに存在するおよびis oldersourceのものよりもです。

したがって、私はsourceで新しいファイルのみをコピーしていますが、targetに存在する必要があります。そうしないと、コピーされません。 (sourceにはtargetよりも多くのファイルが含まれます。)

実際には、sourceから複数のtargetディレクトリにコピーします。ソリューションの選択に影響する場合に備えて、これについて触れます。ただし、必要な場合は、毎回新しいtargetを指定して、コマンドを複数回簡単に実行できます。

20
MountainX

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)
31
slm