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

44

Saya ingin memasukkan folder berikut di terminal:

Milano, Torino (Jan)-Compressed

Bagaimana saya harus menulis perintah cduntuk masuk ke direktori ini?

Spasi dan beberapa karakter khusus lainnya seperti \, *, ), (dan ?menyebabkan masalah ketika saya mencoba untuk menggunakannya dalam baris perintah atau script, 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?

Pomario
sumber
Terkait: Bagian 3.1.2. Mengutip dari pengguna Bash referensi .
Eliah Kagan

Jawaban:

43

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 Anda " menutupi " spasi (dan semua karakter khusus lainnya) sehingga terminal tahu maksud Anda spasi sebagai karakter dan bukan sebagai pemisah:

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

Atau Anda memasukkan nama folder Anda ke dalam tanda kutip :

cd "Milano, Torino (Jan)-Compressed"
Krystoph
sumber
26

Sedikit tip: penyelesaian tab ;-)

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

Cara lain: seret dan lepas

  1. Jika Anda dapat melihat direktori dan jika Anda ingin mengaksesnya menggunakan terminal, cukup ketik: cdpertama dan kemudian seret dan jatuhkan direktori pada terminal dan tekan enter.
Achu
sumber
24

Tulis sebagai:

cd 'Milano, Torino (Jan)-Compressed'

Kalau tidak, itu memperlakukan Milano,sebagai nama folder. Ini terjadi karena spasi pada nama folder. Atau luput beberapa karakter khusus:

cd Milano\,\ Torino\ \(Jan\)-Compressed/
Prateek
sumber
22

tl; dr : Mengutip karakter khusus baik menghindarinya dengan backslash \atau melampirkannya dalam " "tanda kutip ganda atau tunggal ' '. Tab ↹Penyelesaian mengurus kutipan yang tepat.


Apa yang Anda minta disebut Mengutip :

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

Mengutip dengan karakter pelarian \

Garis miring terbalik ( \) adalah karakter pelarian. Ini mempertahankan nilai literal dari karakter berikutnya yang mengikuti, dengan pengecualian <newline>.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepas dari 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 Programmable Penyelesaian (alias Tab ↹Penyelesaian) secara otomatis lolos karakter khusus dengan karakter escape \.

Mengutip dengan tanda kutip ganda " "

Melampirkan karakter dalam tanda kutip ganda mempertahankan nilai literal dari semua karakter dalam tanda kutip, dengan pengecualian $, `, \, dan, ketika ekspansi sejarah diaktifkan, !.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepas setidaknya yang terakhir atau sebagian besar 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 !menyimpan makna khusus mereka di dalam tanda kutip ganda, Ekspansi Parameter , Substitusi Perintah , Ekspansi Aritmatika , dan Ekspansi Sejarah dilakukan pada string yang dikutip ganda.

Mengutip dengan tanda kutip tunggal ' '

Menutup karakter dalam tanda kutip tunggal mempertahankan nilai literal setiap karakter dalam tanda kutip. Kutipan tunggal mungkin tidak terjadi di antara tanda kutip tunggal, bahkan ketika didahului oleh garis miring terbalik.

Jadi untuk memasukkan direktori atau file dengan karakter khusus, lepas setidaknya yang terakhir atau sebagian besar 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 di tldp.org .

pencuci mulut
sumber
10

String C-like dan $ 'string'

Antara lain, seseorang dapat menggunakan $'...'jenis kutipan untuk memanfaatkan karakter backslash ANSI-C seperti \ndan \t, termasuk yang telah Anda sebutkan. Dari manual bash 4.3:

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata diperluas ke string, dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C.

Ini sangat berguna dengan file yang berisi baris baru, tab, saat Anda menulis baris awk yang kompleks di mana Anda perlu memanfaatkan berbagai cara untuk membedakan antara tanda kutip tunggal dan ganda, ketika nama file itu sendiri mengandung tanda kutip tunggal / ganda, dll.

Misalnya, membuat dan mendaftar 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 dengannya disebut inode, yang dirujuk oleh angka desimal tertentu. Jadi Anda dapat menggunakannya untuk secara tidak langsung menemukan file dengan inode tertentu melalui findperintah, dan melakukan 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 individual saat Anda dapat menggunakan glob

Ketika Anda tidak harus berurusan dengan file individual, manfaatkan *karakter glob di shell dan kutip variabel ketika meneruskannya ke perintah lain. Itu membuat berurusan dengan nama file yang sulit menjadi lebih mudah:

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

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

Sergiy Kolodyazhnyy
sumber
6

Untuk membuka folder yang berisi spasi mengelilingi dalam tanda kutip seperti cd "Some Directory"atau melarikan diri ruang dengan garis miring terbalik, seperti: cd /home/kudic/Radna\ površina.

Corey Whitaker
sumber
3
Atau lepas ruang dengan backslash, seperti:cd /home/kudic/Radna\ površina
Timo
Poin yang bagus! Saya lupa menyebutkan itu. Saya biasanya menggunakan tanda kutip karena kebiasaan, tetapi backslash sebenarnya lebih baik untuk digunakan dalam jangka panjang.
Corey Whitaker
1
Atau gunakan tanda kutip tunggal ( 'Radna površina'), jika Anda tidak ingin variabel lingkungan ( $VARNAME) diperluas dan perintah terlampir dalam backticks atau $()dijalankan (atau jika ada tanda kutip ganda dalam nama file).
Eliah Kagan
3

Jika direktori ini ada di folder rumah Anda, ketikkan:

cd "Milano, Torino (Jan)-Compressed"

jika tidak, berikan jalur absolut:

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

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

Harshveer Singh
sumber
Jika Anda memulai jalur dengan garis miring ke depan, ia berakar dari root. Anda mungkin ingin menghapusnya.
isaaclw
@isaaclw Itulah sebabnya dia mengajukannya sebagai jalur absolut: P
1
Ah, itu tiga titik, menunjukkan folder "variabel". Saya berasumsi itu dua titik, menunjukkan "folder induk". Permintaan maaf.
isaaclw
3

Pilihan lain meskipun bukan yang terbaik dalam hal ini adalah menggunakan wildcard. Anda dapat mencoba:

cd *Torino*

Cara terbaik untuk menggunakan metode ini ketika ada kata atau frasa yang berbeda dalam nama direktori yang tidak dibagikan oleh orang lain. Misalnya saya punya mount point / media / DataSSD dan / media / DataHDD. Pelengkapan otomatis tidak berfungsi sampai saya mengetik hampir setengah dari nama sehingga untuk sampai ke partisi HDD saya, saya cukup mengetik

cd /media/*HD*

pengguna242845
sumber