Cara terbaik untuk menyinkronkan file - hanya menyalin file yang ada dan hanya jika lebih baru dari target

18

Saya melakukan sinkronisasi ini secara lokal di Ubuntu 12.04. File-file tersebut umumnya berupa file teks kecil (kode).

Saya ingin menyalin (menjaga mtime stamp) dari sourcedirektori ke targettetapi saya hanya ingin menyalin jika file target sudah ada dan lebih tua dari yang ada di source.

Jadi saya hanya menyalin file yang lebih baru source, tetapi harus ada targetatau tidak akan disalin. ( sourceakan memiliki lebih banyak file daripada target.)

Saya sebenarnya akan menyalin dari sourceke beberapa targetdirektori. Saya menyebutkan ini jika itu berdampak pada pilihan solusi. Namun, saya dapat dengan mudah menjalankan perintah saya beberapa kali, menentukan yang baru targetsetiap kali, jika itu yang diperlukan.

MountainX untuk Monica Cellio
sumber

Jawaban:

29

Saya percaya Anda dapat menggunakannya rsyncuntuk melakukan ini. Pengamatan utama akan membutuhkan menggunakan --existingdan --updateswitch.

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

Perintah seperti ini akan melakukannya:

$ rsync -avz --update --existing src/ dst

Contoh

Katakanlah kita memiliki data sampel berikut.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

Yang terlihat sebagai berikut:

$ 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

Sekarang jika saya menyinkronkan direktori ini tidak ada yang akan terjadi:

$ 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

Jika kami touchfile sumber sehingga lebih baru:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

rsyncPerintah lain dijalankan :

$ 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

Kita dapat melihat bahwa file3, karena ini lebih baru, dan ada dst/, dikirim.

Pengujian

Untuk memastikan semuanya berfungsi sebelum Anda memotong perintah, saya sarankan menggunakan rsyncswitch lain --dry-run,. Mari kita tambahkan yang lain -vjuga agar rsynckeluarannya lebih bertele-tele.

$ 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)
slm
sumber
Terima kasih. Bukankah saya perlu beberapa opsi rsync lagi? Saya membaca halaman manual. Sepertinya saya mungkin perlu ini: rsync --archive --update --existing --whole-file --itemize-changes a/ b. Atau sebagian besar opsi itu tidak perlu? (Saya menambahkan seluruh file karena kebanyakan file teks kecil.)
MountainX untuk Monica Cellio
@MountainX - hanya tambahkan opsi yang Anda butuhkan. Saya akan mulai dengan -aitu superset dari switch -rlptgoD,.
slm
Biarkan saya mengklarifikasi itu. Saya bingung tentang --updatedan --existing. Apakah saya membutuhkan keduanya? Saya menguji solusi Anda dan tampaknya berhasil, tetapi saya masih merasa lebih aman menambahkan --update.
MountainX untuk Monica Cellio
@MXXX - yakin Anda bisa menambahkannya, saya akan memasukkannya ke dalam A juga.
slm