Rsync: menyalin lebih dari cap waktu saja

42

Saat ini saya memiliki dua direktori A / dan B / yang identik dalam segala hal, dengan pengecualian cap waktu. Karena itu jika saya menjalankan perintah:

rsync --dry-run -crvv A/ B/

maka semua file ditandai "uptodate", sedangkan perintahnya:

rsync --dry-run -rvv A/ B/

menunjukkan bahwa semua file akan disalin dari A / ke B /.

Pertanyaan saya adalah ini: mengingat bahwa saya tahu file-file itu identik (berkenaan dengan konten), lalu apakah ada cara (melalui rsync atau sebaliknya) untuk mengatur cap waktu untuk file dalam B / agar identik dengan cap waktu file dalam A /, tanpa menyalin semua file dari A / ke B /?

Terima kasih

artella
sumber
Jika Anda tahu file itu identik, lalu mengapa Anda harus pergi keluar dari cara Anda untuk tidak menyalinnya untuk mendapatkan cap tanggal / waktu yang Anda butuhkan?
Tim
3
@Tim: mungkin ada banyak data.
Richard

Jawaban:

75

Menggunakan -t(mempertahankan cap waktu) dan --size-onlyhanya akan membandingkan ukuran file. Jika ukurannya cocok, rsync tidak akan menyalin file tetapi karena -tditentukan, itu akan memperbarui timestamp pada file tujuan tanpa menyalinnya kembali.

Pastikan untuk tidak menggunakan -u(memperbarui) karena ini akan melewatkan file yang sudah ada dan sepenuhnya melewatkan memperbarui cap waktu.

Saya punya masalah awalnya tidak menggunakan rsync untuk menyalin banyak file ke drive baru, dan oleh karena itu cap waktu diperbarui ke waktu saat ini. Saya menggunakan perintah di bawah ini untuk menyinkronkan semuanya dengan benar dalam waktu yang layak:

rsync -vrt --size-only /src /dest
Grant Pannell
sumber
2
Saya juga menyarankan menambahkan --existinguntuk mencegah salinan file baru yang tidak disengaja.
leden
1
Bendera --archive(atau -a) termasuk -r, -tdan banyak lagi :)
Dor
6

Menggunakan --size-only akan menyebabkan rsync melewatkan membandingkan cap waktu file (dan karenanya konten file) jika ukurannya cocok. Menggabungkan ini dengan --times akan mengkloning stempel waktu melintasi ke pohon target.

pengguna115916
sumber
3

Saya pikir rsync adalah alat yang tepat untuk membuat ini tetapi jika Anda ingin beberapa skrip untuk melakukan ini daripada sesuatu ini dapat memberikan awal yang baik.

Anda bisa mendapatkan daftar file dengan cap waktu (waktu akses) seperti ini:

find . -printf '"%p" %a\n' -type f > /tmp/times

Dan dapatkan perintah pembaruan waktu yang sesuai darinya:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Ini bukan skrip yang lengkap tapi tempat awal yang bagus! :)

Batu
sumber
Terima kasih. Saya pikir saya mungkin akan tetap menggunakan Rsync untuk saat ini, tetapi saya pasti akan pergi ke web dan mempelajari berbagai komponen skrip Anda, karena mungkin berguna di masa depan.
artella
Itu sepertinya solusi saya! Saya ingin menghemat waktu sambil menambahkan beberapa data meta ke perpustakaan musik saya. Namun, ternyata itu tidak dapat menangani spasi dalam nama file):
Burcardo
2

Gunakan direktori sumber (misalnya /path/to/source) sebagai referensi untuk perintah sentuh. Hanya cdke direktori target Anda dan lakukan

find -type f -exec touch -r /path/to/source/{} {} \;

Anda tidak dapat menyalin cap waktu sub-detik dengan rsync (belum).

Ini juga berfungsi untuk direktori dan file semu (cukup hapus atau ubah -type f)

knorke
sumber
Ini berguna bagi saya karena saya perlu atime untuk disalin. Saya perhatikan itu tidak menyalin waktu, yang ok dalam kasus saya.
snapfractalpop
Baca saja halaman manual 'sentuhan'. Anda dapat mengatur atime dan mtime keduanya dengan perintah ini.
knorke
Ya, saya tahu Anda dapat menggunakan touch -artetapi itu masih tidak mengubah waktu. Saya kira itu jarang diinginkan.
snapfractalpop
Ah, saya melihat masalahnya sekarang. Terima kasih. Ya, waktu sulit untuk berubah dan saya tidak tahu mengapa.
knorke
1

Nah, Anda tentu bisa menulis skrip yang membaca stempel waktu dari satu sisi dan kemudian menggunakan sentuhan untuk mengaturnya di file yang sama di sisi lain.

Tapi itu mungkin akan memakan waktu lebih lama daripada membiarkan rsync mencoba menyalin semua file. Sangat sedikit data yang benar-benar akan ditransfer (hanya memblokir hash jika file benar-benar identik). Tetapi konten lengkap dari setiap file harus dibaca setidaknya di setiap sisi. Jadi Anda dibatasi oleh bandwidth disk atau IOPS itu bisa memakan waktu cukup lama. Tetapi mungkin masih lebih sedikit waktu daripada menulis dan menguji naskah untuk melakukannya.

rmalayter
sumber
Terima kasih, saya tidak mengetahui fitur rsync ini (ini juga dibahas di wikipedia).
artella
0

Untuk orang-orang seperti saya yang ingin memodifikasi file dan ingin mempertahankan cap waktu asli (misalnya Anda memperbarui tag meta perpustakaan musik Anda).

Ini didasarkan pada solusi yang disediakan oleh Stone. Namun, di sini tentang waktu modifikasi dan skrip yang berfungsi untuk mengembalikan stempel waktu. Pertama lakukan langkah pertama, kemudian mulai bekerja dengan file Anda.

  1. Pertahankan cap waktu lama . Ini beroperasi dari direktori saat ini, mengecualikan semua file yang tersembunyi, dan menyimpannya ke file sementara di /tmp/files. Anda selalu dapat mengubah parameter, tetapi lebih baik tetap dengan -printf '"%t" "%p"\n'karena touchperintah nanti memanfaatkannya.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Ubah file Anda sebanyak yang Anda suka

  3. sekarang buat file yang membantu Anda mengembalikan cap waktu:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Dan akhirnya menerapkan tanggal lama ke file yang dimodifikasi

    sh job.sh

Peringatan: berfungsi untuk file dengan spasi nama, karakter khusus, tetapi misalnya tidak ada file dengan $tanda masuk.

Burcardo
sumber
Untuk menghindari (beberapa) masalah dengan garis miring terbalik pada nama file Anda, gunakan read -r line. Yah, selalu gunakan readdengan -r. Selain itu, Anda dapat menghindari pembukaan job.shuntuk setiap file. Letakkan pengalihan di akhir perintah:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello
Peringatan 2: Skrip ini tidak mentransfer stempel waktu pada direktori. (Yah, OP tidak memintanya.)
hagello
0

Cara terbaik untuk menyalin cap waktu saja di Windows:

Untuk menyalin stempel waktu yang terakhir dibuat / dimodifikasi / diakses file lain, Anda dapat menggunakan:

sentuh / c / m / a / r SourceFile DestFile

(Versi Touch ini adalah bagian dari Win32 Console ToolBox http://www.stevemiller.net/apps/ )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA

Pierre
sumber
-1

Manual rsync: man rsyncdaftar a -tdan -Nswitch, mereka mungkin layak mengutak-atik.

Tim
sumber
Saya tidak bisa melihat -N. Mengapa Anda merekomendasikan ini?
Tom Hale