Apakah lebih baik selalu menyalin dan menghapus, daripada memindahkan?

18

Secara umum, saya merasa panik ketika saya menyadari bahwa jika saya membatalkan pemindahan file, itu dapat menyebabkan target atau sumber menjadi tidak lengkap. Pertanyaan ini berlaku untuk platform berbasis Windows dan Unix. Saya tidak pernah ingat persis bagaimana perintah pindah bekerja dalam kedua kasus. Misalnya, jika Anda memindahkan direktori; apakah itu menyalin seluruh direktori, dan kemudian menghapusnya, atau apakah itu menyalin dan kemudian menghapus setiap file secara individual?

Saya selalu menyadari, setelah mengetikkan sesuatu seperti mv verybigdir dest, bahwa saya mungkin harus mengetik cp -R verybigdir dest  &&  rm -R verybigdir(di mana &&operator melanjutkan ke perintah berikutnya hanya jika yang pertama berhasil) - atau apakah ini tidak ada gunanya? Apa yang terjadi, tepatnya, ketika saya menekan Ctrl+ Csetengah dari suatu langkah? Demikian juga, apa yang sebenarnya terjadi pada Windows ketika saya menekan tombol batal?

Saya tidak dapat menghitung berapa kali saya memindahkan sesuatu (terakhir kali ketika menggunakan svn) dan memiliki dua direktori, dengan konten terbagi. Saya kira jawabannya sulit, karena tidak semua aplikasi memindahkan grup file dengan cara yang sama.

Nick Bolton
sumber
16
Apa pun yang Anda lakukan, jangan hapus dulu.
mtone
@monotone Hilarious +1
Nick Bolton

Jawaban:

10

Di Windows, pindah ke drive dan partisi yang sama akan bertindak seperti perintah mv Unix dan mengganti nama folder atau mengubah induknya. Namun, jika Anda memindahkannya ke driver atau partisi lain, itu akan menyalin dan menghapus file dengan file, maka mengapa lebih efisien untuk menggunakan file tar atau file zip tanpa kompresi untuk memindahkan file lebih cepat melintasi partisi dan hard drive . Jika Anda membatalkannya, itu hanya akan berhenti di tempatnya. Saya akan percaya hal yang sama berlaku untuk Unix tetapi saya tidak cukup bereksperimen dengan itu untuk menjadi 100% yakin. Ini hanya masalah mengubah inode, tetapi jika ada di partisi atau drive lain, maka itu perlu disalin ke sektor-sektor di partisi atau drive itu. Jika Anda membatalkannya selama transfer, itu sudah memindahkan beberapa file, dan file yang sedang ditransfer akan melihatnya '

Pembaruan: Jika Anda ingin membatalkan suatu langkah dan ingin melanjutkannya, cukup terbitkan kembali urutan untuk pindah. Mungkin memperingatkan Anda bahwa folder tujuan sudah ada, tetapi file tidak akan ditimpa (kecuali mereka ada sebelum perpindahan asli, atau ditambahkan di antara dua perintah pemindahan) karena segera setelah ditransfer, mereka dihapus dari sumber (jika pada partisi atau drive yang berbeda).

Serigala
sumber
Ah, saya belum memikirkan kompresi.
Nick Bolton
Anda tidak perlu mengompres, yang membutuhkan banyak waktu. Terkadang tingkat kompresi 0 (penyimpanan) dapat melakukan pekerjaan untuk memindahkan folder besar melintasi drive lebih cepat.
Wolf
"Di Windows, pindah ke drive dan partisi yang sama akan bertindak seperti perintah mv Unix dan mengganti nama folder atau mengubah induknya." - Saat menggunakan Windows Explorer itu tidak benar. Memang banyak omong kosong, butuh waktu lama, dan Anda mungkin berakhir dengan konten terbagi di dua direktori, lihat jawaban ini untuk pertanyaan saya .
maaartinus
@maaartinus Sebenarnya, cara kerja Windows Explorer adalah menggali secara rekursif dalam folder daripada mengubah simpul induk. Anda benar meskipun untuk Windows Explorer, itu bukan hanya gerakan atom. Saya berasumsi baris perintah sedang digunakan, saya seharusnya bertanya.
Wolf
11

Bahkan pada komputer yang sangat stabil yang tidak pernah gagal: jika Anda peduli dengan cap waktu, maka mvitu lebih baik daripada polos cp.

( cp -aakan menyimpan stempel waktu untuk Anda, dan saya menganggap sesuatu yang serupa ada di Windows).

Arjan
sumber
1
Aha, cap waktu. Saya tidak mempertimbangkan itu! +1
Nick Bolton
Apakah cap waktu bahkan penting secara jujur ​​...
Marcin
1
@ Marsin, mereka ada di sana karena suatu alasan, jika itu yang Anda tanyakan ...
macek
10

Tidak.

Penjelasan:

mv verybigdir dest

mengganti nama verybigdir ke dest. Ini adalah operasi atom, yaitu tidak bisa gagal di tengah jalan.

Jika dest ada di perangkat lain, mv akan menyalin terlebih dahulu, lalu menghapus versi yang lama. Ini bukan operasi atom. Jika gagal, Anda mungkin hanya memiliki sebagian salinan verybigdir di dest, tetapi verybigdir masih akan lengkap.

Ya, aplikasi lain mungkin memindahkan file secara berbeda.

Timo Stamm
sumber
2
Sebenarnya, saya pikir mv di Linux menyalin / menghapus setiap file atau direktori satu per satu, daripada menyalin seluruh pohon ke tujuan kemudian menghapus seluruh pohon dari sumber ... jadi jika Anda membatalkan setengah jalan, Anda akan berakhir dengan beberapa file di kedua tempat, dan direktori tidak akan lengkap.
merampok
3
@rob: Tidak. Direktori adalah file seperti yang lainnya, dan diperlakukan dengan cara yang sama. Perilaku yang Anda bicarakan tercapai mv verybigdir/* dest.
dmckee
2
Pada dasarnya, mv menangani setiap argumen dengan cara "cp && rm" ... mv verybigdir/* destmembagi mv dari verybigdir menjadi banyak operasi pemindahan yang terpisah. Selalu ingat bahwa tidak seperti pada Windows, program / alat Linux tidak dapat melihat bahwa "*" di sana, itu diperluas oleh shell.
Jürgen A. Erhard
4

Di windows saya selalu menyalin dan menghapus alih-alih pindah. Saya pernah memindahkan file dan di sinilah saya pertama kali melihat memory stick yang buruk. Ketika memindahkan file itu berhenti di antara dan saya mendapat kesalahan jadi saya memeriksa folder sumber dan file itu hilang kemudian saya memeriksa tujuan dan ada file yang rusak. Ini terjadi lebih sering dengan file ukuran lebih besar dan kebanyakan dari mereka adalah unduhan yang memakan waktu berjam-jam jadi saya sarankan menyalin dan kemudian menghapus. Hemat waktu Anda di awal akan terbayar pada akhirnya.

di.
sumber
3

Pada unix, pada gerakan yang tidak melewati batas sistem file, mvtidak menyalin data: itu hanya memperbarui database inode di berbagai direktori. Ini jauh lebih cepat daripada cppada file besar.

Lebih jauh lagi, menggunakan mvbatasan sistem file hanya secara diam-diam memanggil mekanisme salin dan hapus.

Jadi saya pikir Anda harus memilih mv.

dmckee
sumber
Disimpulkan dengan baik.
Nick Bolton
"mekanisme salin dan hapus" dapat diartikan sebagai "salin setiap file, lalu hapus" atau "salin semua file, lalu hapus semuanya".
j_random_hacker
2

Di Windows, setidaknya, perpindahan hanyalah Copy & Delete yang lebih otomatis. Saya percaya saya memindahkan setiap file satu per satu, artinya ^ c-ing tidak akan kehilangan file apa pun, Anda hanya akan berakhir dengan file Anda terbagi di antara dua tempat - tidak seperti Windows Explorer, yang akan memindahkan semua file saat dibatalkan.

Solusi saya untuk ini adalah: Jangan pernah bergerak kecuali saya yakin saya ingin memindahkannya.

Phoshi
sumber
1

Jika Anda menggunakan ACL pada sistem file sumber, tetapi tidak pada tujuan, mv di Linux akan menyalin sumber dan kemudian - karena ketidakmampuan untuk mengatur ACL pada tujuan - berhenti. Jadi Anda akhirnya memiliki file di kedua sisi. Tidak ada saklar dalam mv untuk mencegah perilaku itu sehingga dalam hal ini cp &&rm lebih disukai.

uli42
sumber