Apakah ada beberapa perbedaan antara mv dan {cp + rm file lama} di Unix?

13
  • mv a b

  • cp a b;rm a

Ini adalah dua set pernyataan. Apakah ada perbedaan antara apa yang mereka lakukan?

Lazer
sumber
1
atomicity? Saya tidak benar-benar tahu apakah perintah mv adalah atom.
Adriano Varoli Piazza
Iya. Kenapa kamu bertanya?
1
Sekarang, mvmirip dengan ln+ rm, meskipun, yang pertama akan bekerja untuk perpindahan lintas-sistem file (yang kemudian menjadi cp+ rm), sedangkan yang terakhir akan gagal di ln(yang tidak mendukung tautan keras lintas-sistem file).
Chris Jester-Young
Setiap hari adalah hari sekolah - bagi siapa pun yang datang ke sini bertanya-tanya bagaimana menimpa perilaku default ini, Anda memerlukan --remove-destinationsakelar - stackoverflow.com/a/9371263/409638
robert

Jawaban:

20

Dengan asumsi file yang terlibat berada di sistem file yang sama, maka mv cukup mengubah pointer dalam sistem file, sedangkan cp menyalin seluruh isi file, dan rm sekali lagi mengubah pointer. Jadi mv jauh lebih efisien.


sumber
tetapi mereka melakukan hal yang persis sama, bukan?
Lazer
8
Tidak, mereka tidak.
2
@ eSKay: Tidak. Dua skenario: 1. Target tidak ada. mvhanya mengganti nama file (inode sama dengan file asli). cpmembuat inode baru untuk file baru. 2. Target memang ada. mvmembatalkan tautan (menghapus) file target, dan mengganti nama, dalam satu langkah. cpmenimpa inode file target.
Chris Jester-Young
7
Juga mvtidak pernah mengubah izin atau kepemilikan. Bayangkan Anda ingin memindahkan file dari homedir teman Anda ke homedir Anda sendiri. Jika Anda memilikinya mv, Anda akan berakhir dengan file di homedir Anda milik teman Anda. Anda tidak dapat chownatau chmoddan bergantung pada izin yang bahkan tidak mengubah atau membacanya. Jika Anda cpdiikuti oleh rmfile akan menjadi milik Anda dan semuanya baik-baik saja.
Ludwig Weinzierl
9

Ya, mv memiliki peluang menjadi atom pada disk yang sama, sedangkan kombinasi cp dan rm tidak pernah ada.

Ini dengan asumsi bahwa mv diimplementasikan menggunakan rename(), yang merupakan panggilan yang memiliki jaminan. Lihat, misalnya, posting newsgroup ini , yang mengutip POSIX:

Fungsi rename () ini setara untuk file biasa dengan yang ditentukan oleh standar ISO C. Penyertaannya di sini memperluas definisi itu untuk memasukkan tindakan pada direktori dan menentukan perilaku ketika parameter baru memberi nama file yang sudah ada. Spesifikasi itu mensyaratkan aksi fungsi menjadi atom.

beristirahat
sumber
7

Pada sistem file yang sama mv mengubah referensi direktori, menunjuk ke inode yang sama (data file dan metadata) dengan demikian:

  • adalah operasi atom (tidak dapat terganggu oleh operasi file proses lain)
  • hanya membutuhkan sedikit ruang disk tambahan (nama tambahan dalam direktori)
  • mempertahankan izin dan kepemilikan file
  • bisa jauh lebih cepat, tergantung pada jumlah data

Salin dan hapus

  • bukan atomik (proses lain dapat mengganggu antara perintah cp dan rm)
  • membutuhkan penyimpanan data file dua kali pada disk untuk waktu yang singkat (antara perintah cp dan rm)
  • mengubah izin file dan kepemilikan ke default
  • bisa jauh lebih lambat atau bahkan gagal, tergantung pada jumlah data
mpez0
sumber
4

Ketika sumber dan tujuan berada pada volume fisik yang sama, maka pendekatan pertama hanyalah mengubah nama dan sangat cepat (bahkan jika file sangat besar).

cp& rmakan selalu harus memuat / menyimpan semua data, bahkan jika itu tidak perlu.

Joachim Sauer
sumber
3

mv pada dasarnya adalah operasi "ganti nama". Ini berarti file itu sendiri dibiarkan di tempat yang sama pada disk. Tidak ada operasi file yang sebenarnya dilakukan.

Philippe Leybaert
sumber
2

Iya.

mv hanya mengubah metadata sistem file pada file yang berkaitan dengan nama dan lokasi itu, sedangkan cp membuat salinan file yang terpisah, yang membutuhkan waktu lebih lama karena harus sepenuhnya membaca file pertama dan kemudian menulis isinya ke file lain

pengecut anonim
sumber
2

cp dan rm jauh lebih berat pada penggunaan disk, dan mungkin gagal karena alasan ruang disk.

Ofir
sumber
2

Perbedaannya adalah bahwa mv menyimpan atribut file sedangkan cp secara default tidak, misalnya mengatur tanggal pembuatan ke tanggal saat ini.

Untuk mengganti default ini, gunakan "cp -p" untuk mempertahankan modifikasi data terakhir, waktu akses terakhir, ID pengguna dan ID grup (hanya jika ia memiliki izin untuk melakukan ini), mengajukan bit izin file dan SUID dan SGID bit.

harrymc
sumber