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


18

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

私はから(mtimeのスタンプを保存)をコピーしたいsourceのディレクトリtargetが、私はのみで、ファイル場合コピーしたいtarget すでにが存在している高齢の1以上source

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

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

回答:


29

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。もう1つ追加し-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)

ありがとうございました。いくつかのrsyncオプションは必要ありませんか?私はマニュアルページを読んでいます。私はこれが必要かもしれないようです:rsync --archive --update --existing --whole-file --itemize-changes a/ b。または、これらのオプションのほとんどは不要ですか?(これらはほとんどが小さなテキストファイルであるため、ファイル全体を追加しました。)
Monica CellioのMountainX 14

@MountainX-必要なオプションのみを追加します。まず-a、スイッチのスーパーセットです-rlptgoD
slm

それを明確にしましょう。とについて混乱し--updateてい--existingます。両方必要ですか?私はあなたのソリューションをテストしましたが、うまくいくようですが、まだ追加するのが安全だと感じてい--updateます。
Monica CellioのMountainX 14

@MountainX-確実に追加できます。Aにも追加します。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.