Ini adalah situasi saya saat ini (disederhanakan, pada kenyataannya tentu saja banyak dan file besar):
Dir1/
a b c
Dir2/
a b c d
Ini telah terjadi sebelumnya:
- abc disalin dari Dir1 ke Dir2.
- Dalam Dir2 cap waktu abc dimodifikasi secara tidak sengaja.
- d sengaja ditambahkan ke Dir2.
Sekarang saya ingin melakukan ini: Sinkronkan Dir2 kembali ke Dir1. (Untuk yang berkepentingan: Saya menggunakan rsync)
- d baru dan karenanya harus disalin.
- abc dalam Dir2 dan Dir1 memiliki ukuran dan konten data yang identik, tetapi ukurannya berbeda. Karenanya mereka akan disalin secara tidak perlu .
Saya tahu bahwa rsync dapat membandingkan file dengan --checksum atau --size-only. Tetapi pemeriksaan intensif disk / cpu ini harus diulang di setiap sinkronisasi yang akan datang. Sebaliknya saya lebih suka sekali dan untuk semua memperbaiki kesalahan saya dengan mengembalikan cap waktu file asli dari orang-orang di Dir1 ke orang-orang di Dir2 dengan alat. Kemudian kesalahan saya diperbaiki, dan sinkronisasi di masa depan dapat berjalan secara efisien.
Pada Windows, alat ini hanya dapat menyalin cap waktu (tanpa menyalin data):
Adakah yang tahu alat CLI / GUI yang sesuai untuk Mac OS X?
Jawaban:
Bendera --size-only di rsync bukan CPU atau disk intensif dibandingkan dengan pemeriksaan rsync standar, bahkan lebih cepat karena biasanya rsync akan memeriksa ukuran file DAN cap waktu. Anda dapat menggunakan perintah sentuh untuk secara eksplisit mencocokkan cap waktu pada abc di Dir2. Anda dapat menghapus file dalam dir2 dan rsync lagi. Saran ini bagus jika satu ton file sehingga Anda bisa membungkusnya dalam skrip atau menemukan. Perhatikan bahwa jika Anda hanya menjalankan rsync lagi, dalam mode tipikal tetapi dengan --partial optinoal juga (katakanlah rsync -az --partial Dir1 Dir2) ia tidak akan menyalin file lagi, sebaliknya ia akan mencoba menyinkronkannya dengan cerdas yang saya percaya akan berakhir hanya mentransfer stempel waktu dalam kasus ini.
sumber
--size-only
selesaikan situasi Anda, paling tidak dalam keadaan tertentu : Jika stempel waktu sumber rusak dan Anda tidak keberatan memasukkannya ke tujuan, tetapi setidaknya simpan sendiri transfer data yang tidak perlu. Solusi : Jalankan rsync Anda sekali dengan--size-only
. Stempel waktu file tujuan Anda diperbarui (hanya metadata, permanen di tujuan) dari sumber yang ditunjukkan dengan.f..t......n
selain nama file mereka! Kemudian jalankan rsync lagi tanpa--size-only
dan rsync akan memberi tahu Anda semuanya sudah disinkronkan dengan benar, diperlukan transfer nil!Mungkinkah cap waktu tidak penting bagi Anda? Tidak jelas dari pertanyaan apakah Anda lebih tertarik untuk melestarikannya atau melakukan rsyncs tanpa harus menyalin semua data itu. Jika Anda tidak peduli dengan stempel waktu, Anda dapat menggunakan perintah sentuh untuk menetapkan tanggal tertentu pada semua file di kedua mesin sehingga keduanya sama. Sesuatu seperti:
Kemudian menjalankan rsync akan bekerja tanpa harus khawatir karena cap waktu akan sama pada kedua kotak. Saya tidak berada di dekat kotak OS X saya untuk menguji apakah ini berfungsi tetapi saya telah melakukan ini di Linux sebelumnya.
sumber
Saya tidak yakin cara yang bagus untuk melakukan ini dengan rsync, saya juga tidak punya pengalaman dengan max osx, berikut ini adalah upaya di linux dan saya harap ini akan bekerja untuk Anda atau 'cukup dekat'.
Peringatan: Ini pasti cara paling elegan untuk mencapai hal ini :)
Kita harus melihat setiap file dalam dir1 yang juga ada di dir2, dan melakukan black magic kita di atasnya
ketika Anda pertama kali menjalankan ini, ia tidak akan membuat modifikasi dan sebaliknya hanya mengulangi apa yang akan dilakukan, jika Anda merasa ini yang Anda inginkan maka batalkan komentar pada baris
#touch -d "$NEWDATE" $TOFILE
penjelasan
memberi kami waktu modifikasi file dalam format yang dapat dibaca manusia
akan mengatur tanggal nama file yang dimodifikasi menjadi stempel waktu, namun sentuhan tampaknya rewel terhadap format waktu yang diperlukan (itu tidak cukup cocok dengan output dari stat% y, dan sepertinya tidak memungkinkan zaman juga).
akan mengatur ulang output dari
stat -c %y
sehingga dapat diambil olehtouch -d
mengumpulkan ini kita dapatkan
sumber
do$' syncdate2.sh: line 6:
untuk FROMFILE difind $FROMDIR -type f
; lakukan $ '