Mengapa mv jauh lebih cepat daripada cp? Bagaimana cara memulihkan dari perintah mv yang salah?

17

Saya seret dan jatuhkan folder ke folder lain karena kesalahan di FileZilla.

~/big_folder
~/some_other_folder

Folder yang dipindahkan adalah yang sangat besar. Ini termasuk ratusan ribu file (node_modules, file gambar kecil, banyak folder)

Yang sangat aneh adalah bahwa setelah saya melepaskan mouse saya, pemindahan selesai. Folder "big_folder" dipindahkan ke "some_other_folder".

~/some_other_folder/big_folder

(tidak ada big_folderdi ~/setelah pindah)

Kemudian saya menyadari kesalahan dan mencoba mundur tetapi gagal pada FileZilla dan terminal.

Lalu saya harus cp -rmenyalin file kembali karena ada kode sisi server mengakses file-file di~/big_folder

Dan butuh selamanya untuk menunggu ...

Apa yang harus saya lakukan?

BTW, berikut ini adalah output dari FileZilla (ini adalah kegagalan untuk kembali):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'
AGamePlayer
sumber
37
Pesan kesalahan yang paling berguna received failure with description 'Failure',.
Kapten Man
3
Pergi ke terminal, dan ketik perintah mv /root/some_other_folder/big_folder /root/big_folder. Apa pesan kesalahan yang Anda dapatkan?
ctrl-alt-delor
Saya mungkin akan pergi dengancp -al
Nemo
1
mv vs cpPertanyaan OP ditanggapi, tetapi saya ingin mendengar mengapa dia bisa memindahkan folder dalam satu arah secara instan tetapi tidak pada yang lainnya.
user1717828
4
Karena alasan yang sama, memindahkan buku dari satu kamar ke kamar lain lebih cepat daripada membuat salinan buku.
David Richerby

Jawaban:

63

Jika suatu direktori dipindahkan dalam sistem file yang sama (partisi yang sama), maka yang diperlukan hanyalah mengubah nama path file direktori tersebut. Tidak ada data selain entri direktori untuk direktori itu sendiri yang harus diubah.

Saat menyalin direktori, data untuk setiap file perlu diduplikasi. Ini melibatkan membaca semua sumber data dan menuliskannya di tempat tujuan.

Memindahkan direktori antar sistem file akan melibatkan menyalin data ke tujuan dan menghapusnya dari sumber. Ini akan memakan waktu selama menyalin (menggandakan) data dalam sistem file tunggal.


Jika FileZilla berhasil mengubah nama direktori dari ~/big_foldermenjadi ~/some_other_folder/big_folder, maka saya akan mengembalikannya menggunakan

mv ~/some_other_folder/big_folder ~/big_folder

... setelah pembuatan pertama yakin bahwa tidak ada direktori yang disebut ~/big_folder(jika ada, langkah tersebut akan dimasukkan big_folderdari some_other_folderke ~/big_folderdirektori sebagai subfolder).

Kusalananda
sumber
6
Oh ... itukah sebabnya saya melihat kata "renaming" daripada "moving" di output?
AGamePlayer
2
@ AGamePlayer Ya, benar.
Kusalananda
4
@ AGamePlayer "Failure" sayangnya bukan deskripsi kesalahan yang baik. Saya akan menggunakan mv ~/some_other_folder/big_folder ~/setelah memastikan tidak ada yang lain big_folderdi direktori home. Saya belum pernah menggunakan FileZilla.
Kusalananda
10
Alasan lain untuk tidak bergantung pada alat GUI Windows untuk melakukan pemeliharaan file di Unix.
Mark Stewart
4
@MarkStewart mengapa "on Unix" di akhir komentar Anda ?; Apakah ada saat ketika itu adalah ide yang bagus?
ctrl-alt-delor
11

Jawaban yang ada bagus, tapi saya ingin sedikit mengembangkannya dengan menunjukkan dengan tepat apa yang terjadi ketika Anda bergerak versus ketika Anda menyalin file. Ketika Anda melihat syscalls selama salinan, Anda melihat:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

Ini membuka file sumber, lalu membuat file kedua. Kemudian membaca isi file sumber ke memori dan menulis memori itu ke file tujuan. Ini memerlukan beberapa sakelar konteks dan beberapa disk I / O yang dapat cukup tinggi untuk file besar. Namun jika Anda memindahkan file, Anda melihat:

rename("hello1.txt", "hello2.txt")         = 0

Penting untuk diingat bahwa Anda hanya akan melihat nama file diubah jika berada pada partisi yang sama pada disk fisik yang sama. Jika Anda membuat file besar multi-gigabyte dan kemudian memindahkannya di antara dua lokasi di rumah Anda, Anda akan melihat tindakan selesai secara instan. Jika, di sisi lain, Anda memindahkannya ke perangkat eksternal, itu akan memakan waktu lama untuk bergerak seolah-olah Anda menggunakannya cpsebagai gantinya. Ini karena memindahkan file hanya dapat dilakukan dengan mengubah nama file jika berada di partisi yang sama.

hutan
sumber
OP memindahkan direktori, bukan file.
AL
Itu masih berlaku tho, kecuali OP bergerak folder kosong, yang akan menjadi satu-satunya kasus di mana tidak ada file yang terlibat
glace
@AL Dalam sistem mirip Unix, semuanya adalah file.
Thegs
@AL File teks hanyalah sebuah contoh. Untuk direktori, satu-satunya perbedaan adalah Anda akan memiliki beberapa panggilan getdents()dan mkdir()ditaburkan di sekitar.
hutan