Mengapa `mv file / dir` tidak memindahkan file ke subdirektori dari direktori kerja saat ini?

10

Saya berada di /etcdirektori saya dan mengetik perintah

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

Saya pikir itu akan memindahkan file ke direktori openvpnyang merupakan subdirektori dari /etcdirektori. Namun, sepertinya bukan itu yang terjadi. Yang bisa saya konfirmasikan adalah bahwa perintah dijalankan.

daftar putih
sumber

Jawaban:

51

Asalkan direktori dengan nama ini tidak ada, Anda mengganti nama file untuk openvpnberada di direktori root Anda /. Untuk mengembalikan ini, jalankan:

sudo mv /openvpn /etc/MyFile.conf

Jika direktori itu ada, Anda memindahkan file di dalamnya, maka pengembaliannya adalah:

sudo mv /openvpn/MyFile.conf /etc/

Untuk memindahkannya ke subdirektori yang ada dari direktori saat ini, Anda dapat menjalankan salah satu dari ini - yang menggunakan jalur relatif :

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.adalah tautan ke direktori saat ini, jadi ./pada awal jalur berarti "di direktori ini". Garis miring di bagian akhir berarti openvpndirektori dan Anda ingin memindahkan file di dalamnya. Jika Anda tidak menyediakannya, file tersebut akan dipindahkan ke dalamnya jika direktori dengan nama ini ada, jika tidak maka file tersebut akan diubah namanya menjadi openvpn. Dengan /di bagian akhir, mvakan memperingatkan Anda jika direktori hilang dan tidak mengganti nama, jadi itu cara aman jika Anda tidak ingin mengganti nama.

Jika jalur Anda dimulai dengan /di sisi lain itu adalah jalur absolut terlepas dari direktori kerja saat ini, itu selalu relatif terhadap direktori root /. Menggunakan path absolut untuk file dan tujuan, perintah Anda akan terlihat seperti ini:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

Bacaan lebih lanjut

pencuci mulut
sumber
2
Jika Anda tidak tahu apakah direktori tersebut ada atau tidak, coba sudo mv /openvpn/MyFile.conf /etc/perintahnya terlebih dahulu. Dalam skenario yang mungkin direktori tidak ada, itu hanya akan memberi Anda kesalahan (mungkin "Bukan direktori") dan tidak menyentuh sistem file. Lalu, Anda bisa melakukannya sudo mv /openvpn /etc/MyFile.conf.
flarn2006
9

Anda harus menggunakan

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

untuk memindahkan MyFile.conffile ke dalam openvpnsub-direktori /etc/.

Di samping itu

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

akan memindahkan file ke /direktori sebagai openvpn(mis. ganti nama sebagai openvpn) (dengan asumsi /openvpndirektori tidak ada).

pomsky
sumber
3
Juga, garis miring pada akhir perintah pertama adalah opsional. Tapi saya kira itu kebiasaan yang baik untuk masuk, karena akan membuat perintah gagal jika itu bukan direktori, daripada menciptakan situasi yang membingungkan seperti yang dijelaskan OP (atau lebih buruk lagi, menimpa file penting.)
flarn2006
4

Saat Anda memindahkan file, Anda memberi tahu OS direktori tempat Anda ingin meletakkannya, atau jalur baru yang ingin Anda berikan.

Anda memberi tahu OS "/ openvpn". Jadi itu akan melakukan hal itu - periksa apakah / openvpn ada (artinya objek yang disebut "openvpn" yang terletak di direktori root) dan merupakan direktori, dan jika demikian pindahkan file Anda ke dalamnya, atau jika / openvpn adalah file atau tidak ada, ganti nama dan pindahkan file Anda sehingga sekarang dapat diakses sebagai / openvpn.

Apa yang Anda ingin lakukan adalah memindahkannya ke dalam direktori "openvpn", yang dapat ditemukan di direktori Anda saat ini , bukan yang ada di direktori root sistem file (yang merupakan arti dari tanda "/" yang memimpin). Jadi Anda harus arahkan ke yang dir dalam perintah bergerak, tidak path absolut "/ openvpn". Semua ini akan bekerja:

  • mv MyFile.conf openvpn - lihat di dir saya saat ini untuk "openvpn"
  • mv MyFile.conf /etc/openvpn - cari path absolut / etc / openvpn
  • mv MyFile.conf openvpn/ - lihat di dir saya saat ini, untuk dir yang disebut openvpn
  • mv MyFile.conf ./openvpn - membuat "dir sekarang" bahkan lebih jelas

Versi singkat - Anda mungkin menggunakan "/" berarti "direktori saya saat ini", oleh karena itu "/ openvpn" berarti "openvpn yang ada di direktori saya saat ini". Tapi "/" terkemuka hanya berarti "direktori root", jadi "/ openvpn" berarti "openvpn di direktori root". Yang Anda butuhkan hanyalah menggunakan "openvpn" atau "openvpn /", yang berarti "openvpn di direktori saya saat ini ".

Stilez
sumber
1
Tidak yakin mengapa jawaban ini diturunkan; itu benar dan saya benar-benar berpikir itu yang paling jelas!
Lightness Races dalam Orbit
1

Setiap jalur yang dimulai dengan /adalah jalur absolut, bukan relatif.

Jika semua jalur selalu relatif terhadap direktori saat ini, bagaimana Anda cd /etc? Anda harus cd ../../../../../etcdan berharap itu cukup level .., atau terus lakukan cd ..sampai Anda tiba di direktori root.

Atau Anda perlu beberapa sintaks lain untuk mengekspresikan jalur absolut. Tetapi Unix memutuskan untuk /mengartikan absolut, yang lainnya relatif terhadap direktori kerja proses saat ini. Begitu mv MyFile.txt openvpnjuga bekerja.


Dan tidak, itu tidak akan berfungsi dengan baik untuk menyimpulkan absolut vs relatif dari file yang ada atau tidak. Kami tidak ingin mkdirpanggilan sistem memperlakukan jalur berbeda dari chdiratau renamepanggilan sistem, dan membuat mvprogram melakukannya hanya menyisakan ruang untuk inkonsistensi antara mvdan beberapa program lain yang menggunakan nama file keluaran.

mvsudah istimewa karena ketika rename()tujuan adalah direktori, itu menambahkan nama file sumber ke direktori tujuan dan mencoba lagi. Tetapi perhatikan bahwa satu strategi implementasi sederhana bergantung pada rename()panggilan sistem pertama gagal dengan EEXISTatau EISDIR. Jadi kita harus tahu apakah path relatif atau absolut sebelum memeriksa sistem file.

(Early Unix berjalan pada komputer lambat, di mana pemeriksaan tambahan jika ada direktori bisa berarti I / O tambahan jika tidak di-cache, atau lebih banyak tekanan pada caching direktori. Tapi saya pikir argumen kewarasan / kebenaran sudah cukup untuk menjelaskan mengapa tebakan pertama Anda bukan cara yang masuk akal bagi sistem untuk bekerja, tanpa menggunakan argumen efisiensi historis.)

Peter Cordes
sumber
1

Untuk melengkapi jawaban lain:

mv file.txt /location

sama dengan, untuk Windows

mv file.txt c:\location

The filesystem di linux diperkirakan sesuai dengan filesystem standar hirarki , atau FHS untuk pendek. ini membantu Anda mengetahui di mana file harus ditempatkan tergantung pada sifat dan kontennya.

Folder pertama (setara dengan c:di Windows) adalah /.

Pierre-Antoine Guillaume
sumber