Saya sudah menyalin file terabyte rsync
tetapi saya lupa menggunakan --archive
untuk mempertahankan atribut khusus file.
Saya mencoba mengeksekusi rsync
lagi kali ini dengan --archive
tetapi itu jauh lebih lambat dari apa yang saya harapkan. Apakah ada cara mudah untuk melakukan ini lebih cepat hanya dengan menyalin metadata secara rekursif?
filesystem
rsync
metadata
Mohammad
sumber
sumber
Jawaban:
Ok, Anda dapat menyalin pemilik, grup, izin dan cap waktu menggunakan
--reference
parameter untukchown
,chmod
,touch
. Berikut ini skrip untuk melakukannyaAnda harus menjalankannya dengan
sudo
(untuk mengizinkan chown) dan dengan dua parameter: direktori sumber dan tujuan. Script hanya menggemakan apa yang akan dilakukan. Jika puas ganti barismyecho=echo
denganmyecho=
.sumber
touch --reference=otherfile file
. Diperbarui jawabannyatouch
secara desain hanya mengubah waktu modifikasi dan akses, waktu "pembuatan" tidak terpengaruh. (Saya pikir ext2 / 3 tidak mendukung perubahan waktu, tetapi mungkin masalah jika Anda menggunakan NTFS atau sejenisnya).-c
peralihan ketouch
perintah untuk menghentikannya membuat file kosong di$dst_path
.PERINGATAN: Tanpa solusi khusus, GNU
cp --attributes-only
akan memotong file tujuan, setidaknya dalam Precise. Lihat hasil edit di bawah.Asli:
Dalam situasi ini, Anda mungkin menginginkan
--attributes-only
opsi GNU cp , bersama dengan--archive
, ketika kode ini dicoba dan diuji, apakah semua atribut filesystem-agnostik dan tidak mengikuti symlink (mengikutinya bisa buruk!):Seperti halnya file,
cp
aditif dengan atribut yang diperluas: jika kedua sumber dan tujuan memiliki atribut yang diperluas, ia menambahkan atribut yang diperluas sumber ke tujuan (daripada menghapus semua xattrs tujuan terlebih dahulu). Meskipun ini mencerminkan bagaimanacp
perilaku jika Anda menyalin file ke pohon yang ada, itu mungkin tidak seperti yang Anda harapkan.Perhatikan juga bahwa jika Anda tidak menyimpan tautan keras pertama kali
rsync
tetapi ingin mempertahankannya sekarangcp
tidak akan memperbaikinya untuk Anda; Anda mungkin terbaik menjalankan kembalirsync
dengan opsi yang tepat (lihat jawaban saya yang lain ) dan bersabar.Jika Anda menemukan pertanyaan ini sambil berusaha memisahkan dan menggabungkan kembali konten metadata / file dengan sengaja maka Anda mungkin ingin melihat metastore yang ada di dalam repositori Ubuntu.
Sumber: manual GNU coreutils
Diedit untuk menambahkan:
cp
dari GNUcoreutils
> = 8.17 dan di atas akan berfungsi seperti yang dijelaskan, tetapi coreutils <= 8.16 akan memotong file ketika memulihkan metadata mereka. Jika ragu, jangan gunakancp
dalam situasi ini; gunakanrsync
dengan opsi yang tepat dan / atau bersabarlah.Saya tidak akan merekomendasikan hal ini kecuali jika Anda sepenuhnya memahami apa yang Anda lakukan, tetapi GNU sebelumnya
cp
dapat dicegah memotong file menggunakan trik LD_PRELOAD :sumber
errorno
seharusnyaerrno
, kan?rsync
dengan opsi yang tepat adalah jawaban untuk pertanyaan lain ...Memperlakukan pertanyaan sebagai "rsync hanya memiliki metadata untuk disalin, jadi mengapa begitu lambat, dan bagaimana saya bisa membuatnya lebih cepat?":
rsync
biasanya menggunakan mtimes yang sama sebagai heuristik untuk mendeteksi dan melewati file yang tidak berubah. Tanpa--archive
(khusus, tanpa--times
) mtimes file tujuan tetap disetel ke waktu Anda rsync-ed mereka, sementara mtimes file sumber tetap utuh (mengabaikan tipu daya manual oleh Anda). Tanpa jaminan eksternal dari Anda bahwa konten file sumber tidak berubah, rsync harus berasumsi bahwa mereka mungkin memilikinya dan karenanya harus melakukan checksum dan / atau menyalinnya ke tujuan lagi. Ini, ditambah fakta yang--whole-file
tersirat untuk sinkronisasi lokal-> lokal, membuatrsync
tanpa--times
kira - kira setara dengancp
untuk sinkronisasi lokal.Asalkan memperbarui konten file tujuan dapat diterima, atau jika file sumber tidak tersentuh sejak salinan asli, Anda harus menemukan
rsync --archive --size-only
lebih cepat daripada rsync naif.Jika ragu-ragu untuk
rsync
menyalin apa yang memakan waktu begitu lama,rsync --archive --dry-run --itemize-changes ...
memberi tahu Anda secara lengkap, jika singkat, detail.sumber
Dalam transfer lokal, ketika sumber dan tujuan berada pada sistem file yang dipasang secara lokal,
rsync
akan selalu menyalin seluruh isi file. Untuk menghindarinya bisa Anda gunakansumber
rsync
tidak menggunakan pintasan ketika file keduanya berada di jalur lokal, tetapi itu tidak mencegahrsync
dari menyalin konten.Saya harus melakukan ini dari jarak jauh ke komputer lain sehingga saya tidak bisa menggunakan --referensi
Saya menggunakan ini untuk membuat skrip ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Tapi pastikan tidak ada nama file dengan "di dalamnya dulu ...
find | grep '"'
Kemudian salin touch.sh ke komputer jarak jauh Anda, dan jalankan ...
cd <DestinationFolder>; sh /tmp/touch.sh
Ada juga opsi di -printf untuk mencetak pengguna, nama grup jika Anda ingin menyalinnya.
sumber
find
. Saya berada dalam situasi yang sama - lupa menyalin atribut, disk sumber dan tujuan sudah ada di mesin yang berbeda dan tidak benar - benar ingin membalikkan itu.