mv
dan rsync
bukanlah program yang serupa. Khususnya, mv
sering mencoba untuk sekadar mengganti nama objek. Jika berada dalam sistem file yang sama, konten tidak akan disalin sama sekali.
Jika Anda belum memiliki imperative_PLs/fortran
, lalu mv
akan mengambil fortran
yang ada direktori dan ganti nama ke titik itu di pohon.
Tetapi Anda sudah memiliki direktori (dengan konten) di lokasi tersebut. Karena nama hanya dapat mereferensikan satu objek, direktori yang ada harus dihapus atau diganti namanya. mv
menganggap Anda tidak ingin melakukan keduanya dan membatalkan.
rsync
alih-alih menyalin file individual dan konten lainnya di dalam fortran
dan menempatkannya ke dalam imperative_PLs/fortran
yang ada direktori.
Anggap saja sebagai rename
sebaliknya, dan perilaku tersebut mungkin tampak lebih dapat dimengerti.
mv
sebenarnya adalah rename
di bawah penutup.
Jika Anda memindahkan file ke file lain, mv
menganggap Anda tahu apa yang Anda lakukan dan menimpa file tujuan.
Jika Anda memindahkan direktori ke direktori lain, mv
menganggap Anda ingin mempertahankan nama dasar direktori asli Anda dan membuatnya di direktori target. Jika belum ada direktori dengan nama tersebut di sisi tujuan, atau jika direktori dengan nama tersebut ada tetapi kosong, operasi berhasil.
Namun, jika direktori target sudah ada dan tidak kosong, ini bukan lagi sebuah rename
tetapi itu harus berupa penghapusan file dan direktori rekursif. rename
tidak dirancang untuk melakukannya sehingga gagal, mv
tidak melangkah lebih jauh karena menganggap Anda tidak ingin melakukannya dan juga gagal.
-
mv
tidak bekerja dalam kasus ini karena tidak dirancang untuk melakukannya. Panggilan sistem (mungkin) juga- Pindah ke sistem file yang sama:
rename
(awalnyalink
danunlink
) - Pindah lintas sistem file:penyalinan file rekursif diikuti dengan
unlink
rekursif
- Pindah ke sistem file yang sama:
-
Opini:Saya pikir itu tidak terlalu dirancang bukan berfungsi, karena tidak dirancang untuk menangani kasus penggunaan ini. Untuk alat "sederhana" yang dimaksudkan untuk melakukan satu hal dengan baik, Anda perlu menyediakan satu set sakelar untuk menunjukkan
mv
jalur tindakan mana yang harus diambil:- Untuk menebus kesalahan, seperti dalam implementasi saat ini
- Untuk menggabungkan, bailing dengan error jika file sudah ada
- Untuk menggabungkan, mengganti file target yang sudah ada
Jika tindakan menggabungkan/mengganti adalah yang Anda inginkan, Anda dapat mengimplementasikannya dengan cukup mudah dengan cp
diikuti oleh rm
, atau dengan menggunakan salah satu utilitas penyalinan struktur file tar
, pax
, dll.