Praktik terbaik untuk melanjutkan mv

13

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?

Apa
sumber
Saya menulis skrip yang sama , yang menggunakan cmpbukannya hashing. Ini memiliki ketergantungan, dan masalah yang sama dengan while readyang 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.
joeytwiddle
3
@joeytwiddle penawaran rsync --delete-during receiver deletes during the transferdan juga beberapa alternatif lain yang berguna: --delete --delete-before --delete-delay --delete-after --delete-excluded. Jadi, ya, rsync adalah alternatif terbaik,
Isaac
Saya pasti melewatkan sesuatu. Mengapa tidak mengulangi mvpekerjaan perintah yang sama ? Mungkin *ditambahkan ke jalur sumber jika sumber aslinya adalah direktori.
jpa
@isaac Tidak, saya khawatir rsync --delete*akan menjadi bencana ! Ini akan menghapus hal-hal dari destyang saat ini tidak ada src, sehingga semua file yang berhasil dipindahkan dalam upaya sebelumnya sekarang akan dihapus! Anda mungkin berpikir rsync --remove-source-filesbahwa saya setuju akan menjadi alternatif yang baik. ( selengkapnya1 , lebih2 )
joeytwiddle
@ joeytwiddle Tidak, hanyarsync --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.
Isaac

Jawaban:

46

Lupakan tentang mencoba menciptakan kembali rsync, dan gunakan rsync.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

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 ada drive2, seperti mv -i, itu lebih rumit, karena Anda sekarang perlu membedakan file yang sudah disalin dan file yang belum. Anda dapat meneruskan --ignore-existingopsi ke rsync untuk melewati file yang sudah ada di tujuan terlepas dari kontennya. Perhatikan bahwa jika dokumen asli mvterputus di tengah pembuatan file, file ini akan tetap dalam kondisi setengah-disalin (sedangkan telanjang rsync -aakan 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 mvgerakan lintas drive yang besar, justru karena sulit mengontrol apa yang terjadi jika terganggu. Gunakan rsync untuk melakukan penyalinan, lalu hapus yang asli.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apa janji yang dibuat rsync bahwa mv tidak?
Apa
4
baik, misalnya rsyncmelakukan apa yang Anda coba lakukan, sementara mvtidak. 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/rsync
Silly Freak
1
@SillyFreak harus saya simpulkan dari itu, bahwa saya harus selalu menggunakan rsync bukan mv, tidak hanya seperti yang dikatakan Gilles untuk cross-drive, tetapi operasi apa pun, karena batas "terlalu besar" relatif subyektif dan jika menyangkut masalah itu akan diselesaikan oleh rsync?
Apa
9
baik, ketika saya memindahkan file atau direktori di dalam satu partisi, saya biasanya menggunakan mv(atau manajer file) karena itu hanya memindahkan referensi ke file / direktori. Jika saya perlu melakukan transfer data aktual, maka saya menggunakan rsyncjika 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, rsynchanyalah alat yang tepat, dan mvatau cptidak.
Silly Freak
7
Saya akan menyarankan untuk selalu menjalankan perintah rsync dengan -v dan -dry-run dulu untuk mengkonfirmasi apa yang akan dilakukan.
Darren