Bagaimana cara memutuskan bahwa mv pindah ke direktori daripada mengganti direktori?

18

Katakanlah saya punya direktori /hello.

Lalu saya lakukan mv /hello /hello2.

Apakah saya pindah /helloke /hello2/hello? Atau saya pindah /helloke /hello2?

Tampaknya ketika saya melakukan sesuatu seperti ini, saya mendapatkan hasil yang tidak konsisten.

pengguna4951
sumber
1
Dalam hal apa hasilnya tidak konsisten? Tampaknya kapan pun direktori target ada, ia bergerak ke direktori target, jika tidak maka namanya akan diganti.
jmathew
Itu tidak konsisten. Perintah yang sama harus melakukan hal yang sama. Itu berarti perintahnya ambigu.
user4951
Itu tidak benar-benar tidak konsisten karena bertindak konsisten dalam konteks. Meskipun saya dapat melihat bagaimana hal itu membingungkan tetapi semakin saya memikirkannya, perintahnya harus seperti itu agar dapat bekerja untuk semua skenario.
jmathew
Saya lebih suka mengatakan begitulah ia dirancang dan juga logis..jika Anda menggunakan mvfile, ia melakukan hal yang sama.hanya mengganti nama.tetapi mvdengan direktori Tidak baik menghapus seluruh direktori dengan subdirektori karena satu mvperintah yang tidak aman. jadi dipindahkan sebagai test1/test2. tetapi jika Anda masih ingin mencapai itu menulis aliasyang memeriksa apakah parameter yang diberikan adalah direktori dan kemudian lakukan rm -rf direktori dan gunakan mvperintah tetapi gunakan dengan risiko Anda sendiri.
harish.venkat
Saya menduga contoh Anda didasarkan pada misremembering sesuatu yang telah terjadi di masa lalu, berdasarkan "Sepertinya saya melakukan sesuatu seperti ini". Jika keduanya /hellodan /hello2direktori, maka saya perhatikan itu cp /hello /hello2adalah salah satu yang tidak konsisten. Bergantung pada kombinasi dari garis miring yang ada, terkadang konten /hellodisalin ke dalamnya /hello2, dan terkadang direktori itu sendiri disalin.
Izkata

Jawaban:

16

mv a bmencoba untuk pindah ake bapakah bdirektori atau symlink ke direktori. Jika tidak, itu akan mengubah nama (atau menyalin dan menghapus jika pada sistem file yang berbeda) amenjadi b.

Untuk mendapatkan hasil yang konsisten untuk memindahkan file ke direktori, Anda dapat melakukan:

mv file dir/

atau

mv file dir/.

Jika dirtidak ada, Anda akan mendapatkan kesalahan, dan itu tidak akan diubah namanya filemenjadi dir.

Jika, di sisi lain, Anda ingin melakukan renametanpa harus khawatir jika file tujuan ada sebagai direktori atau tidak, dengan GNU mv, Anda dapat melakukan:

mv -T file dest

Dalam hal ini, filetidak akan dipindahkan ke destjika destdirektori. Namun, jika keduanya filedan destmerupakan direktori dan destkosong, fileakan diubah namanya menjadi dest(dan yang asli destdihapus). Jika keduanya direktori dan desttidak kosong, mv -Takan mengeluh.

Sama, jika filedan destyang tidak direktori (dan itu termasuk symlink termasuk symlink ke direktori), fileakan diubah namanya menjadi dest(meskipun Anda akan mendapatkan prompt jika Anda tidak memiliki izin untuk menulis dest), dan asli destakan dihapus. Ada perbedaan dengan mv file destdi mana destsymlink ke direktori. Dengan -T, filediubah namanya menjadi dest, tetapi tanpa -T, filedipindahkan ke direktori yang ditunjuk oleh dest.

Jadi singkatnya, setelah itu mv -T file dest, apakah fileakan diubah namanya menjadi destatau Anda akan mendapatkan pesan kesalahan (atau prompt). Jika perintah berhasil, yang asli dest, jika ada sebelumnya akan dihapus.

Stéphane Chazelas
sumber
14

Ini sepenuhnya tergantung pada apakah sudah ada direktori bernama '/ hello2' yang sudah ada atau tidak.

Jika / hello2 ada DAN adalah direktori, maka move akan selalu pindah / hello ke / hello / hello2

Jika / hello2 tidak ada, maka pindah akan selalu mengganti nama / hello ke / hello2

Jika / hello2 ada DAN adalah file, Anda akan mendapatkan kesalahan, "tidak dapat menimpa 'hello2' tanpa direktori dengan direktori 'hello'.

Don Simon
sumber
3

Saya mencoba ini

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

harap ini menjelaskan semuanya. -vadalah mode verbose.

harish.venkat
sumber