Pertanyaan Bagaimana cara memasukkan file atau direktori dengan karakter khusus dalam namanya?


Saya ingin memasukkan folder berikut di terminal:

Milano, Torino (Jan)-Compressed

Bagaimana saya harus menulis perintah cd untuk masuk ke direktori ini?

Spasi dan beberapa karakter khusus lainnya seperti \, *, ), ( dan ? menyebabkan masalah ketika saya mencoba menggunakannya di baris perintah atau skrip, misalnya:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

Bagaimana cara memasukkan nama file atau direktori yang berisi karakter khusus di terminal secara umum?


34
2018-02-05 11:58


asal




Jawaban:


Perintah itu ambigu karena spasi biasanya digunakan untuk memisahkan argumen. cd tidak tahu apa yang ingin Anda lakukan tetapi Anda memiliki dua kemungkinan untuk menyelesaikannya:

Entah kamu "topeng"ruang-ruang (dan semua karakter khusus lainnya) sehingga terminal tahu Anda berarti ruang sebagai karakter dan bukan sebagai pemisah:

cd Milano\,\ Torino\ \(Jan\)-Compressed

Atau Anda memasukkan nama atau jalur folder Anda tanda kutip:

cd "Milano, Torino (Jan)-Compressed"

37
2018-02-05 12:05



Atau gunakan tanda kutip tunggal ('Milano, Torino (Jan)-Compressed'), jika Anda tidak ingin variabel lingkungan ($VARNAME) untuk diperluas dan perintah diungkit dalam tanda kutip atau $() untuk dijalankan (atau jika ada tanda kutip ganda dalam namafile). - Eliah Kagan


Tuliskan sebagai

cd 'Milano, Torino (Jan)-Compressed'

Kalau tidak, itu akan memperlakukan Milano, sebagai nama folder. Ini terjadi karena spasi di nama folder.

Atau melarikan diri beberapa karakter khusus ...

cd Milano\,\ Torino\ \(Jan\)-Compressed/

23
2018-02-05 11:59



Anda juga dapat menggunakan Tab untuk pelengkapan otomatis di dalam tanda kutip ganda untuk meloloskan diri tanda kutip ganda dalam namafile. - htorque
Perhatikan bahwa tanda kutip ganda tidak akan membantu Anda cd ke dalam sebuah direktori bernama $money, sebagai contoh. Anda harus menulis '$money' atau \$money. - Dietrich Epp
Saya pikir umumnya tanda kutip tunggal lebih eksplisit, dan standar yang lebih baik. Keduanya berfungsi, tetapi tanda kutip tunggal bekerja lebih sering dan mengatakan "persis seperti yang Anda lihat". - isaaclw
@isaaclw Terima kasih, saya setuju! Diedit. - Prateek


Sedikit tip: penyelesaian tab :)

  1. Cukup ketik huruf pertama misalnya cd Mi (atau huruf lainnya jika diperlukan) dan tekan Tab. Terminal akan membantu Anda dengan menyelesaikan kata-kata istirahat.

Cara lain: menyeret dan penurunan

  1. Jika Anda dapat melihat direktori dan jika Anda ingin mengaksesnya menggunakan terminal, cukup ketik: cd pertama dan kemudian drag dan drop direktori pada terminal dan tekan memasukkan.

22
2018-02-05 12:35



Harus mencintai tab selesai <3 - Rinzwind
Sementara jawaban yang diterima secara teknis benar, dalam prakteknya Anda akan menginginkan penyelesaian tab sehingga Anda tidak perlu melakukan semua yang melarikan diri. - phasetwenty
@Achu, tetapi terkadang bahkan penyelesaian tab itu sendiri tidak berfungsi untuk direktori yang mengandung karakter utama yaitu -, dll, sehingga metode yang disarankan adalah cd -- '-foo-/'. tapi kami masih bisa menggunakan penyelesaian tab di dalam kutipan;) - Amir


tl; dr: Untuk mengutip karakter khusus baik melarikan diri dengan backslash \ atau melipatnya menjadi dua kali lipat " " atau tanda kutip tunggal ' '. Tab ↹ Penyempurnaan menangani kutipan yang tepat.


Apa yang Anda minta disebut Mengutip:

Mengutip digunakan untuk menghapus arti khusus dari karakter atau kata-kata tertentu ke shell. (...) Ada tiga mekanisme pengutipan: the karakter melarikan diri, tanda kutip tunggal, dan tanda kutip ganda.    [kutipan diambil man bash]

Mengutip dengan karakter pelarian \

Backslash yang tidak dikutip (\) Adalah karakter pelarian. Ini mempertahankan nilai literal dari karakter berikutnya yang mengikuti, dengan pengecualian <newline>.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepaskan yang terakhir dengan \, misalnya:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bash's Penyelesaian yang Dapat Diprogram (aka Tab ↹ Penyelesaian) secara otomatis mengeluarkan karakter khusus dengan karakter pelarian \.

Mengutip dengan tanda kutip ganda " "

Melampirkan karakter dalam tanda kutip ganda mempertahankan nilai literal dari semua karakter dalam tanda kutip, dengan pengecualian $, `, \, dan saat perluasan riwayat diaktifkan, !.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepaskan setidaknya bagian terakhir atau sebagian besar dari nama file atau jalur Anda dengan tanda kutip ganda, misalnya:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

Sebagai $, ` dan ! menjaga makna khusus mereka di dalam tanda kutip ganda, Ekspansi Parameter, Pergantian Komando, Ekspansi Aritmatika dan Ekspansi Riwayat dilakukan pada string yang dikutip ganda.

Mengutip dengan tanda kutip tunggal ' '

Melampirkan karakter dalam tanda kutip tunggal mempertahankan nilai literal masing-masing karakter dalam tanda kutip. Sebuah kutipan tunggal mungkin tidak terjadi di antara tanda kutip tunggal, bahkan ketika didahului oleh backslash.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepaskan setidaknya bagian terakhir atau sebagian besar dari nama file atau jalur Anda dengan tanda kutip ganda, misalnya:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

Anda dapat menemukan lebih banyak tentang Mengutip di man bash/ QUOTING, di wiki.bash-hackers.org dan terus tldp.org.


21
2017-12-09 21:31



'\' istirahat shell sintaks highlighter SE. - David Foerster
@DavidFoerster Ada batas dari google prettify (yang digunakan untuk itu), tetapi saya pikir lebih baik daripada tidak sama sekali ... Bagaimana kalau sekarang? ; P - dessert
Itu lebih merupakan pernyataan fakta dan sedikit kejutan daripada kritik atas posting Anda. Satu-satunya kritik di sini mungkin pergi ke penyorot sintaks. Saya tidak akan melakukan apa-apa tentang hal itu secara pribadi. - David Foerster


String seperti-C dan $ 'string'

Di antaranya, yang bisa digunakan $'...' jenis kutipan untuk menggunakan karakter backslash ANSI-C seperti \n dan \t, termasuk yang telah Anda sebutkan. Dari bash 4.3 manual:

Kata-kata dari bentuk $ 'string' diperlakukan secara khusus. Kata itu mengembang   ke string, dengan karakter backslash-escape diganti seperti yang ditentukan   oleh standar ANSI C.

Ini sangat berguna dengan file yang berisi baris baru, tab, ketika Anda menulis baris awk yang rumit di mana Anda perlu menggunakan berbagai cara untuk membedakan antara tanda kutip tunggal dan ganda, ketika nama file itu sendiri berisi single / double quote mishmash, dll.

Misalnya, membuat dan mencantumkan file seperti itu:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

Anda dapat menggunakan nilai hex karakter, seperti:

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

Ide yang sama seperti sebelumnya - manfaatkan karakter pelarian:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

Gunakan inode:

Setiap file atau direktori memiliki struktur data khusus yang terkait dengan itu disebut inode, yang direferensikan oleh angka desimal tertentu. Jadi Anda dapat menggunakannya untuk secara tidak langsung menemukan file dengan inode tertentu melalui find perintah, dan lakukan sesuatu dengannya:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

Hindari berurusan dengan file individu ketika Anda dapat menggunakan glob

Ketika Anda tidak perlu berurusan dengan file individual, manfaatkan saja * karakter glob dalam shell dan variabel quote ketika meneruskannya ke perintah lain. Itu membuat berurusan dengan nama file yang sulit jauh lebih mudah:

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

Perhatikan penggunaan ./ - perlindungan terhadap nama file yang mungkin mengandung leading - di dalamnya.


9
2017-12-09 21:43





Untuk membuka folder berisi ruang yang mengelilinginya dalam tanda kutip seperti cd "Some Directory" atau melarikan diri dari ruang dengan backslash, seperti: cd /home/kudic/Radna\ površina.


6
2017-07-10 13:41



Atau melarikan diri dari ruang dengan backslash, seperti: cd /home/kudic/Radna\ površina - Timo
Poin bagus! Saya lupa menyebutkan itu. Saya biasanya menggunakan tanda kutip karena kebiasaan, tetapi garis miring terbalik sebenarnya lebih baik digunakan dalam jangka panjang. - Corey Whitaker
Atau gunakan tanda kutip tunggal ('Radna površina'), jika Anda tidak ingin variabel lingkungan ($VARNAME) untuk diperluas dan perintah diungkit dalam tanda kutip atau $() untuk dijalankan (atau jika ada tanda kutip ganda dalam namafile). - Eliah Kagan


Jika direktori ini ada di folder rumah Anda, ketikkan:

cd "Milano, Torino (Jan)-Compressed"

lain berikan jalur absolut:

cd "/…/…/Milano, Torino (Jan)-Compressed"

jika ada kutipan ganda dalam nama file maka lepaskan itu dengan \"


3
2018-02-05 12:00



Jika Anda memulai jalur dengan garis miring ke depan, ia pergi dari root. Anda mungkin ingin menghapusnya. - isaaclw
@isaaclw Itulah mengapa ia mengajukannya sebagai jalur absolut: P
Ah, itu tiga titik, menunjukkan folder "variabel". Saya berasumsi itu adalah dua titik, menunjukkan "folder induk". Permintaan maaf. - isaaclw