Saya menggunakan terminal untuk menyalin file dari satu drive ke drive lain.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
Namun itu tiba-tiba berhenti, sementara beberapa jam masuk, dan tanpa kesalahan, setelah membuat direktori.
Solusi saya sendiri untuk itu sering campuran hashing dan membandingkan yang sebagian besar merupakan kekacauan memakan waktu karena sekarang saya harus memulihkan dari salinan perantara tanpa benar-benar mengetahui file mana yang hilang (ditulis sebagai liner yang sangat panjang untuk zsh - perhatikan bahwa skrip ini tidak berfungsi dalam bash seperti yang ditulis):
source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
echo "${hash_and_file}" | read hash file;
echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
mv -v "${copy_from}" "${copy_to}" | tee -a log;
rm -v "${copy_from}" | tee -a log; };
done <<<$(
comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${source_directory}: :g" | sort;
) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${target_directory}: :g" | sort; ) )
Ini rawan kesalahan jika direktori target nama atau sumber_direktori adalah bagian dari jalur, dan hapus file jika belum dipindahkan karena ditandai sebagai duplikat. Juga tidak pada akhirnya direktori sumber.
Apakah ada praktik terbaik bagaimana memulihkan dari mv terganggu?
sumber
cmp
bukannya hashing. Ini memiliki ketergantungan, dan masalah yang sama denganwhile read
yang disebutkan Gilles. Ini juga lambat dan bertele-tele. Tapi itu membebaskan ruang disk lebih cepat daripada metode rsync, karena file (kembali) dipindahkan dari sumber saat dijalankan. Ini bisa menjadi inspirasi bagi mereka yang berani.--delete-during receiver deletes during the transfer
dan juga beberapa alternatif lain yang berguna:--delete --delete-before --delete-delay --delete-after --delete-excluded
. Jadi, ya, rsync adalah alternatif terbaik,mv
pekerjaan perintah yang sama ? Mungkin*
ditambahkan ke jalur sumber jika sumber aslinya adalah direktori.rsync --delete*
akan menjadi bencana ! Ini akan menghapus hal-hal daridest
yang saat ini tidak adasrc
, sehingga semua file yang berhasil dipindahkan dalam upaya sebelumnya sekarang akan dihapus! Anda mungkin berpikirrsync --remove-source-files
bahwa saya setuju akan menjadi alternatif yang baik. ( selengkapnya1 , lebih2 )rsync --delete
akan menghapus file lain yang bukan bagian dari sumber. Dari [man rsync] () * hapus file-file asing dari direktori tujuan *. Pahami apa artinya asing : Tidak disinkronkan. Dan ya, rsync juga menyediakan cara untuk menghapus file sumber setelah ditransmisikan dengan benar.Jawaban:
Lupakan tentang mencoba menciptakan kembali rsync, dan gunakan rsync.
Pastikan Anda menggunakan garis miring pada sumber, jika tidak maka akan menyalin
/location/to/drive2/drive1
.Periksa ulang apakah perintah berhasil, kemudian jalankan
rm -rf /location/to/drive1/
.Perintah di atas akan menimpa file yang sudah ada sebelumnya
drive2
. Jika Anda ingin meminta pengguna untuk melewati file yang sudah adadrive2
, sepertimv -i
, itu lebih rumit, karena Anda sekarang perlu membedakan file yang sudah disalin dan file yang belum. Anda dapat meneruskan--ignore-existing
opsi ke rsync untuk melewati file yang sudah ada di tujuan terlepas dari kontennya. Perhatikan bahwa jika dokumen aslimv
terputus di tengah pembuatan file, file ini akan tetap dalam kondisi setengah-disalin (sedangkan telanjangrsync -a
akan selesai menyalinnya).Jika Anda ingin mereproduksi perilaku persis
mv -i
, termasuk bisikan, itu bisa dilakukan, tetapi itu jauh lebih rumit.Perhatikan bahwa liner satu raksasa Anda sangat rapuh. Jika ada nama file yang mengandung garis miring terbalik atau baris baru, mereka mungkin tidak disalin dengan benar atau mereka bahkan dapat menipu skrip Anda untuk menghapus file yang sewenang-wenang. Jadi jangan gunakan kode dalam pertanyaan kecuali Anda yakin dapat mempercayai nama file untuk tidak mengandung garis miring terbalik atau baris baru.
Untuk referensi di masa mendatang, saya sarankan untuk tidak pernah menggunakan
mv
gerakan lintas drive yang besar, justru karena sulit mengontrol apa yang terjadi jika terganggu. Gunakan rsync untuk melakukan penyalinan, lalu hapus yang asli.sumber
rsync
melakukan apa yang Anda coba lakukan, sementaramv
tidak. Juga: menyalin antara mesin yang berbeda; kompresi untuk transfer; melewatkan file yang ada di tujuan berdasarkan kesetaraan berbasis timestamp atau hash; penanganan kepemilikan, izin, tautan, dan file khusus yang dapat dikonfigurasi; dll. linux.die.net/man/1/rsyncmv
(atau manajer file) karena itu hanya memindahkan referensi ke file / direktori. Jika saya perlu melakukan transfer data aktual, maka saya menggunakanrsync
jika salah satu dari yang berikut ini benar: 1) Saya memindahkan lebih banyak file daripada sekilas saya dapat memeriksa transfer yang benar; 2) Saya mengantisipasi bahwa saya harus menyimpan file dalam sinkronisasi; 3) Saya berharap transfer bisa terganggu. Maksud saya adalah, untuk kasus penggunaan yang Anda presentasikan dalam pertanyaan,rsync
hanyalah alat yang tepat, danmv
ataucp
tidak.