Alat Mac OS X untuk menyinkronkan / menyalin HANYA timestamp daripada data file? Tidak ada transfer data file, hanya metadata sistem file yang disinkronkan

5

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):

  • Robocopy dengan opsi / COPY: T
  • WinSCP dalam mode Sinkronkan stempel waktu

Adakah yang tahu alat CLI / GUI yang sesuai untuk Mac OS X?

porg
sumber
Seperti yang disebutkan, di masa lalu saya sudah menyelesaikan tugas ini di Windows. Saya sekarang ingin tahu apakah alat semacam itu ada untuk Mac OS X! Jika tidak, saya hanya akan (secara boros) menyalin semua data, bukan metadata sistem file saja.
porg

Jawaban:

1

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.

Ram
sumber
Terima kasih atas ide bagusnya, tetapi sayangnya dengan rsync dengan --partial dalam situasi kirim / terima lokal (tidak ada jaringan yang terlibat) tidak menghasilkan transfer cerdas (hanya metadata) melainkan transfer data yang lengkap. Selain itu saya mencoba keduanya dengan dan tanpa --compress. Itu tidak mengubah apa pun. Jadi rsync tampaknya bukan alat "transfer metadata" di Mac OS X, yang saya cari.
porg
Bertahun-tahun kemudian: --size-onlyselesaikan 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......nselain nama file mereka! Kemudian jalankan rsync lagi tanpa --size-onlydan rsync akan memberi tahu Anda semuanya sudah disinkronkan dengan benar, diperlukan transfer nil!
porg
@porg Anda merujuk pada diri Anda sebagai orang ketiga di sini?
Ram
1
"Anda" dan "milik Anda" seperti dalam bentuk umum "satu" dan "satu" daripada orang ke-3. Namun terkadang dalam bentuk tertulis saya memang menyebut diri saya sebagai orang ke-3.
porg
0

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:

find dirX -type f -print | xargs touch -t 201108250000

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.

jumlahnya banyak
sumber
Saya juga punya ide ini. Tapi terima kasih tidak, saya sangat ingin cap waktu asli kembali, tanpa menyalin ulang (tidak perlu!).
porg
0

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

#!/bin/bash
# warning, really inelegant bash follows
FROMDIR='dir1'
TODIR='dir2'

for FROMFILE in `find $FROMDIR -type f`; do
        TOFILE=`echo "$FROMFILE" | sed "s/^$FROMDIR/$TODIR/"`
        echo "trying $FROMFILE to $TOFILE"

        if [ -e "$TOFILE" ]; then
                NEWDATE=$(stat -c %y $FROMFILE | awk '{print $2, $1}')
                echo "would perform 'touch -d '$NEWDATE' $TOFILE'"
                #touch -d "$NEWDATE" $TOFILE # uncomment me if you want to perform changes
        fi  
done

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

stat -c %y filename

memberi kami waktu modifikasi file dalam format yang dapat dibaca manusia

touch -d "timestamp" filename

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).

awk '{print $2,$1}'

akan mengatur ulang output dari stat -c %ysehingga dapat diambil olehtouch -d

mengumpulkan ini kita dapatkan

NEWDATE=$(stat -c %y fromfile | awk '{print $2, $1}')
touch -d "$NEWDATE" tofile
cjh
sumber
Hai! Solusi itu terdengar canggih, dan saya ingin mengujinya. Namun, saya menerima kesalahan berikut: syncdate2.sh: line 6: kesalahan sintaks dekat token tak terduga do$' syncdate2.sh: line 6: untuk FROMFILE di find $FROMDIR -type f; lakukan $ '
Burcardo
@Burcardo terima kasih untuk mengetahui itu, 'do $' adalah salah ketik dan '$' seharusnya tidak ada di sana, diperbaiki.
cjh
Terima kasih untuk perbaikannya! Bagaimana dengan nama folder dengan tanda hubung di antara dua spasi? misalnya FROMDIR = "/ media / extHD / my \ folder \ - \ (2016)". Saya menerima kesalahan "temukan: predikat tidak diketahui` - \ '"
Burcardo