'mv' setara dengan seret dan lepas dengan ganti?

19

Dalam lingkungan GUI, drag-and-drop dengan replace akan mengganti file dan seluruh direktori (termasuk konten) dengan apa pun yang sedang disalin. Apakah ada cara untuk mencapai hasil intuitif yang sama dengan perintah 'mv'?

pengguna7089
sumber

Jawaban:

20

Tidak dengan mv.

Fungsi inti dari mv(meskipun namanya) adalah untuk mengubah nama objek. Salah satu jaminan yang dibuat oleh UNIX adalah bahwa penggantian nama bersifat atomik - Anda tidak pernah diizinkan melihat penggantian nama yang diselesaikan sebagian. Jaminan ini bisa sangat berguna jika Anda ingin mengubah file ( /etc/passwd, misalnya) yang mungkin dilihat oleh program lain, dan Anda ingin mereka melihat versi file lama atau baru, dan tidak ada kemungkinan lain . Tetapi "penggantian nama rekursif" seperti yang Anda gambarkan akan mematahkan jaminan itu - Anda bisa menghentikannya di tengah dan Anda akan memiliki pohon setengah bergerak dan mungkin berantakan - sehingga tidak benar-benar cocok dengan filosofi dari mv. Itu dugaan saya mengapa mv -rtidak ada.

(Jangan pedulikan mvfilosofi itu dengan cara lain yang lebih kecil. Misalnya, mvsebenarnya cpdiikuti oleh rmketika memindahkan file dari satu sistem file ke yang lain.)

Filosofi yang cukup. Jika Anda ingin memindahkan pohon ("drag-drop") secara rekursif dari satu tempat ke tempat lain di sistem file yang sama , Anda bisa mendapatkan efisiensi dan kecepatan mvsebagai berikut (misalnya):

cp -al source/* dest/ && rm -r source/*

Tanda -luntuk cpberarti "membuat tautan keras alih-alih menyalin" - secara efektif membuat nama file baru yang menunjuk ke data file yang sama dengan nama file lama. Ini hanya bekerja pada sistem berkas yang mendukung tautan keras, jadi - sehingga sistem berkas asli UNIX-ish baik-baik saja, tetapi tidak akan bekerja dengan FAT.

The &&berarti "hanya menjalankan perintah berikut jika perintah sebelumnya berhasil". Jika suka, Anda dapat menjalankan dua perintah satu per satu sebagai gantinya.

Jander
sumber
Sangat informatif. Terima kasih banyak!
user7089
4

Saya tidak berpikir Anda bisa meniru perilaku drag-drop yang Anda gambarkan mv, karena subdirektori tidak kosong di target tidak akan diganti.

Mungkin rsync? Sesuatu seperti rsync -a -r source/ target/? Jalankan dengan -v -nmelakukan dry-menjalankan verbose terlebih dahulu untuk memastikan itu melakukan apa yang Anda inginkan.

cjc
sumber
3

mv -f /path/to/source/folder/* /destination/folder/

Akan memindahkan semua yang ada di / path / ke / source / folder, termasuk file dan direktori ke / tujuan / folder.

Dan akan menimpa file dan direktori yang ada.

Tim
sumber
2
Hanya direktori kosong
Kevin
1

Anda mungkin ingin mengubah jawaban yang benar untuk ini:

https://github.com/iaindooley/pickdrop

Contoh:

katakan saya punya:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

dan saya ingin memindahkan hal-hal ini ke / situs

jadi sepertinya:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

Saya bisa pergi:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

Ini benar-benar dipotong & tempel.

penguji
sumber
Sangat keren, dan pasti layak untuk dilihat. Namun, pertanyaannya secara khusus tentang 'mv' jadi saya pikir saya akan meninggalkan jawaban yang benar sebagai salah satu yang menjelaskan filosofi di balik mv secara detail. Terima kasih atas kontribusi ini, pasti sangat membantu.
user7089
Juga penting, dari readme: "Ini tidak kuat sama sekali - itu menyimpan pick Anda di ~ / .pick sampai Anda memanggil drop di mana saat itu menggunakan path file di ~ / .pick untuk membuat file ~ / .drop yang dapat dieksekusi baru untuk menyalin masing-masing file yang Anda pilih ke direktori kerja saat ini. "
user7089