Bagaimana cara cd ke direktori dengan nama yang mengandung spasi di bash?


84

Saya mencoba cd "~/Library/Application Support/" -bash: cd: ~/Library/Application Support/: No such file or directory

juga cd ~/Library/Application Support/ -bash: cd: ~/Library/Application Support/: No such file or directory

Jawaban:


113

Anda dapat menggunakan Tabtombol setelah menekan beberapa karakter pertama (ini kemudian akan "mengisi" sisa folder untuk Anda misalnya ketik cd ~/LTabmengisi cd ~/Library/lalu ketik ApTabdan itu akan mengisi sisanya untuk Anda.

Jika ada spasi di antara kata-kata dan Anda tidak ingin menggunakan metode di atas, letakkan a \(backslash) di depan spasi, mis cd ~/Library/Application\ Support.


Apakah case path sensitif atau tidak sensitif? Saya dapat mengakses Library dengan cd ~ / library, tetapi metode tab tidak akan berfungsi jika ada kesalahan.
colinfang

@colinfang OS X adalah case-sensitive, tetapi case-preserving. Bash shell harus sedikit lebih diskriminatif dalam hal pelengkapan otomatis.
NReilingh

@NReilingh - Aha, thx.
colinfang

1
@colinfang: Anda dapat menggunakan shopt -s nocaseglobdan bind 'set completion-ignore-case on'membuat bash kurang sensitif terhadap huruf besar-kecil.
Chris Johnsen

2
colinfang - Untuk penyelesaian tab yang tidak peka huruf dengan kompatibilitas bash, coba 'zsh'. Juga penyelesaian wildcard dari shell ini sangat bagus.
Bahtera Ƭ

27

Masalah inti di sini adalah bagaimana shell ( bash ) tidak mengutip dan bagaimana hal itu mempengaruhi ekspansi tilde dan membelah menjadi "kata-kata" (argumen untuk program yang sedang dijalankan).

bash hanya memperlakukan tilde terkemuka secara khusus jika tidak dikutip. Selain itu, garis miring berikut juga tidak boleh dikutip.

Pada saat yang sama, bash mem-parsing baris perintah menjadi "kata-kata" berdasarkan spasi kosong. The cdPerintah biasanya membutuhkan tepat satu argumen (direktori tujuan). Baris perintah seperti cd foo barartinya dijalankan cddengan dua argumen: foodan bar. Jika Anda hanya ingin mengirim satu foo barargumen, maka Anda perlu mengutip spasi:
(mis.) cd foo\ bar(Lihat lebih banyak contoh kutipan di bawah).

Dalam situasi khusus Anda, Anda harus membiarkan tilde dan slash berikut tidak dikutip sembari mengutip spasi dalam nama direktori. cd "~/Library/Application Support/"Uji coba Anda berakhir dengan mengutip terlalu banyak (tilde dan garis miringnya), sementara cd ~/Library/Application Support/uji coba Anda mengutip terlalu sedikit (ini menghilangkan mengutip ruang dalam nama direktori).

Solusi paling umum adalah menggunakan pelarian satu karakter untuk mengutip ruang saja:

    cd ~/Library/Application\ Support

Anda juga dapat menggunakan tanda kutip tunggal atau ganda di sekitar hanya ruang atau ruang dan beberapa bit lain dari argumen itu (tetapi bukan ~/!):

    cd ~/Library/Application' 'Support
    cd ~/Library/Application" "Support
    cd ~/Library/App'lication 'Support
    cd ~/Library/Application" Supp"ort
    cd ~/'Library/Application 'Support
    cd ~/"Library/Application "Support

Kutipan semacam ini memiliki arti yang berbeda, tetapi mereka identik dalam contoh-contoh ini. Kutipan tunggal melindungi string literal sementara tanda kutip ganda memungkinkan berbagai ekspansi dan substitusi di wilayah yang dikutip.

Seringkali, Anda bisa membiarkan shell melakukan pekerjaan untuk Anda.

  • Globbing (wildcard):

    cd ~/L*/Ap*

    Anda dapat menggunakan shopt -s nocaseglobuntuk membuat case globbing tidak sensitif:

    cd ~/l*/ap*
  • Penyelesaian:

    Menekan Tabsetelah masuk cd ~/Lmungkin akan memperluas ke cd ~/Library/.
    Menekan Tablagi setelah memasukkan Ap(sekarang Anda miliki cd ~/Library/Ap) mungkin akan memperluas ke cd ~/Library/Application\ Support/(shell secara otomatis memasukkan backslash melarikan diri).

    Anda dapat menggunakan bind 'set completion-ignore-case on'untuk membuat penyelesaian kasus tidak sensitif:

    cd ~/l Tabcd ~/Library/; ap Tabcd ~/Library/Application\ Support/


jawaban yang bagus @ Chris Bagaimana Anda membuat karakter Tab terlihat seperti kunci?
robzolkos

4
@RobZ: Ini adalah <kbd></kbd>tag HTML (salah satu dari beberapa tag HTML yang didukung dalam penurunan harga SE ).
Chris Johnsen

9

Ketika Anda mengutip dua kali jalan, Anda menghentikan ekspansi tilde. Jadi ada beberapa cara untuk melakukan ini:

cd ~/"My Code"
cd ~/'My Code'

Tilde tidak dikutip di sini, jadi ekspansi tilde masih akan berjalan.

cd "$HOME/My Code"

Anda dapat memperluas variabel lingkungan di dalam string yang dikutip ganda; ini pada dasarnya adalah apa yang dilakukan ekspansi tilde

cd ~/My\ Code

Anda juga dapat melarikan diri karakter khusus (seperti spasi) dengan garis miring terbalik.


9

Anda juga dapat hanya menarik folder ke jendela Terminal juga, path file / folder lengkap akan disisipkan secara otomatis pada drag.


4

Anda harus keluar dari ruang di " Application Support"

Mencoba $ cd ~/Library/Application\ Support/


0

Jika cara normal tidak berhasil, coba ganti dengan spasi %20.

Ini bekerja untuk saya ketika berhadapan dengan SSH dan perintah gaya domain lainnya seperti auto_smb.


0

Anda dapat mencoba ini untuk folder / file dengan spasi Jika file atau nama folder berisi 1) nama file. Ekstensi perintahnya adalah cd ~ / file \ name.extension / (atau) cd ~ / "file name.extension" /


1
Bagaimana jawaban ini berbeda atau lebih baik dari yang lain, serupa, jawaban?
fsb

Sintaks terminalnya yang sempurna untuk mendefinisikan ruang dan memberikan tanda kutip adalah salah satu yang ditetapkan pengguna dan juga menggunakan kunci tab tidak menggunakan nama seperti 1) filename.ext 2) file name.ext Sambil menekan tab untuk jenis nama otomatis penyelesaian kata ditampilkan hingga "file" pada saat itu kita dapat menggunakan backslash ini untuk mendefinisikan ruang di terminal. @fsp
prasanth sivanesan

Semua info itu harus ada dalam Jawaban untuk menunjukkan kepada pembaca bagaimana perbedaannya dari 9 Jawaban lainnya, termasuk Jawaban yang diterima.
fsb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.