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
rsync
copy
synchronization
timestamp
artella
sumber
sumber
Jawaban:
Menggunakan
-t
(mempertahankan cap waktu) dan--size-only
hanya akan membandingkan ukuran file. Jika ukurannya cocok, rsync tidak akan menyalin file tetapi karena-t
ditentukan, 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:
sumber
--existing
untuk mencegah salinan file baru yang tidak disengaja.--archive
(atau-a
) termasuk-r
,-t
dan banyak lagi :)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.
sumber
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:
Dan dapatkan perintah pembaruan waktu yang sesuai darinya:
Ini bukan skrip yang lengkap tapi tempat awal yang bagus! :)
sumber
Gunakan direktori sumber (misalnya
/path/to/source
) sebagai referensi untuk perintah sentuh. Hanyacd
ke direktori target Anda dan lakukanAnda tidak dapat menyalin cap waktu sub-detik dengan rsync (belum).
Ini juga berfungsi untuk direktori dan file semu (cukup hapus atau ubah
-type f
)sumber
touch -ar
tetapi itu masih tidak mengubah waktu. Saya kira itu jarang diinginkan.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.
sumber
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.
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'
karenatouch
perintah nanti memanfaatkannya.find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
Ubah file Anda sebanyak yang Anda suka
sekarang buat file yang membantu Anda mengembalikan cap waktu:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
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.sumber
read -r line
. Yah, selalu gunakanread
dengan-r
. Selain itu, Anda dapat menghindari pembukaanjob.sh
untuk setiap file. Letakkan pengalihan di akhir perintah:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
Cara terbaik untuk menyalin cap waktu saja di Windows:
(Versi Touch ini adalah bagian dari Win32 Console ToolBox http://www.stevemiller.net/apps/ )
sumber
Manual rsync:
man rsync
daftar a-t
dan-N
switch, mereka mungkin layak mengutak-atik.sumber
-N
. Mengapa Anda merekomendasikan ini?