Adında özel karakter içeren bir dosya veya dizini nasıl girebilirim?


44

Terminalde aşağıdaki klasörü girmek istiyorum:

Milano, Torino (Jan)-Compressed

cdBu dizine girmek için komutu nasıl yazmalıyım ?

Spaces ve diğer bazı özel karakterler gibi \, *, ), (ve ?sorunlara neden komut satırından veya komut dosyaları, örneğin bunları kullanmaya çalıştığınızda:

$ 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 ?
(  )  *  ?  \

Terminalde genel olarak özel karakterler içeren dosya veya dizin adlarını nasıl girebilirim?


İlgili: Bölüm 3.1.2. Teklif arasında Bash .
Eliah Kagan

Yanıtlar:


43

Bu komut belirsizdir, çünkü boşluklar normalde argümanları ayırmak için kullanılır. cd ne yapmak istediğinizi bilmiyor ancak çözmek için iki seçeneğiniz var:

Ya boşlukları (ve diğer tüm özel karakterleri) " maskelersiniz ", böylece terminal sizi boşluktan ayırıcı olarak değil bir karakter olarak tanımlar:

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

Veya klasör adınızı veya yolunuzu tırnak işaretleri içine atarsınız :

cd "Milano, Torino (Jan)-Compressed"

26

Küçük bir ipucu: tab tamamlama ;-)

  1. Sadece ilk harfi yazın; örneğin cd Mi(veya gerekirse daha fazla harf) ve tuşuna basın Tab. Terminal, kalan sözcükleri tamamlayarak size yardımcı olacaktır.

Başka bir yol: sürükle ve bırak

  1. Dizini görebiliyorsanız ve terminal kullanarak erişmek istiyorsanız, önce şunu yazın: cdönce dizini sürükleyip bırakın ve vurun enter.

24

Şunu yaz:

cd 'Milano, Torino (Jan)-Compressed'

Aksi takdirde Milano,, klasör adı gibi davranır . Bu, klasör adındaki boşluklardan kaynaklanır. Alternatif olarak, birkaç özel karakterden kaçının:

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

22

tl; dr : Özel bir karakterden bahsetmek için \ya ters eğik çizgiyle kaçın ya da çift " "veya tek tırnak içine alın ' '. Tab ↹Tamamlama, uygun fiyat teklifi ile ilgilenir.


İstediğin şeye alıntı yapma denir :

Alıntılama, belirli karakterlerin veya kelimelerin özel anlamlarını kabuğa kaldırmak için kullanılır. (…) Üç alıntı mekanizması vardır: kaçış karakteri , tek tırnak işareti ve çift ​​tırnak işareti . [alıntı yapılan man bash]

Kaçış karakteriyle alıntı yapmak \

Alınmamış ters eğik çizgi ( \), kaçış karakteridir. Bunun dışında sonraki karakterin değişmez değerini korur <newline>.

Bu nedenle, özel bir dizine veya bir dosyaya girmek için ikincisinden kaçının \, örneğin:

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 “?”

bashbireyin Programlanabilir Tamamlama (aka Tab ↹Tamamlama) otomatik kaçış karakteri ile özel karakterleri kaçar \.

Çift tırnak ile alıntı " "

Çift tırnak karakterleri çevreleyen hariç, tırnak içindeki tüm karakterlerin değişmez değerini korur $, `, \, ve, geçmiş genişleme etkinken, !.

Bu nedenle, özel bir karaktere sahip bir dizine veya dosyaya girmek için, dosya adınızın veya yolunuzun en azından ikincisinden veya daha büyük bir bölümünden çift tırnak işareti kullanın.

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 “?”

Gibi $, `ve !çift tırnak içinde kendi özel bir anlamı tutmak Parametre Genişleme , Komuta değişikliği , Aritmetik Genişleme ve Tarih Genişleme çift tırnakla üzerinde gerçekleştirilir.

Tek tırnak ile alıntı ' '

Karakterleri tek tırnak işaretleri içine alma, tırnak içindeki her karakterin gerçek değerini korur. Önceden ters eğik çizgiden önce olsa bile, tek tırnaklar arasında tek bir teklif oluşmayabilir.

Bu nedenle, özel bir karaktere sahip bir dizine veya dosyaya girmek için, dosya adınızın veya yolunuzun en azından ikincisinden veya daha büyük bir bölümünden çift tırnak işareti kullanın.

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 “\”

man bashQuoting hakkında / QUOTING , wiki.bash-hackers.org ve tldp.org adresinde daha fazla bilgi bulabilirsiniz .


10

C benzeri dizeler ve $ 'string'

Diğer şeylerin $'...'yanı sıra , bahsettiğinizler de dahil olmak üzere \nve ANSI-C ters eğik çizgi karakterlerinden yararlanmak için alıntı türü kullanabilirsiniz \t. Bash 4.3 el kitabından:

$ 'String' formundaki kelimeler özel olarak değerlendirilir. Sözcük, ANSI C standardında belirtildiği şekilde ters eğik çizgi karakterleriyle değiştirilen dizeye genişler.

Bu, özellikle dosya adları tek / çift tırnak işareti karmakarışık, vb. İçerdiğinde, tek ve çift tırnak arasında ayrım yapmak için farklı yollar kullanmanız gereken karmaşık awk satırları yazarken, yeni satırları, sekmeleri içeren dosyalarda kullanışlıdır.

Örneğin, bu tür dosyaları oluşturma ve listeleme:

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

Aşağıdaki gibi karakter hex değerlerini kullanabilirsiniz:

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

printf

Daha önce olduğu gibi aynı fikir - kaçış karakterlerinden yararlanın:

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

İnode kullan:

Her dosya veya dizin, belirli bir ondalık sayı ile başvuruda bulunulan inode adı verilen özel bir veri yapısına sahiptir. Böylece, dosyayı findkomut ile belirli bir inode ile dolaylı olarak bulmak ve onunla bir şeyler yapmak için kullanabilirsiniz:

$ 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

Glob kullanabildiğiniz zaman bireysel dosyalarla uğraşmaktan kaçının

Tek tek dosyalar ile *uğraşmanız gerekmediğinde, sadece kabuktaki glob karakterinden yararlanın ve diğer komutlara geçirirken değişkenleri alıntılayın. Zor dosya isimlerinin üstesinden gelmeyi çok daha kolay hale getirir:

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

Kullanımına dikkat edin ./- -içinde öncülük edebilecek dosya adlarına karşı bir güvenlik önlemi .


6

Boşluk içeren bir klasörü açmak için gibi tırnak içinde çevreleyen cd "Some Directory"ya da benzeri bir ters eğik çizgi boşluk kaçış: cd /home/kudic/Radna\ površina.


3
Veya ters eğik çizgi ile boşluktan kaçınmak, şöyle:cd /home/kudic/Radna\ površina
Timo

Harika nokta! Bundan bahsetmeyi unuttum. Normalde alışkanlıktan alıntılar kullanırım, ancak ters eğik çizgi uzun vadede kullanmak daha iyidir.
Corey Whitaker,

1
Veya 'Radna površina'ortam değişkenlerinin ( $VARNAME) genişletilmesini ve backticks içine alınmış komutların $()çalıştırılmasını veya çalıştırılmasını istemiyorsanız (veya dosya adında çift tırnak varsa), tek tırnak işaretleri ( ) kullanın .
Eliah Kagan,

3

Bu dizin ana klasörünüzdeyse:

cd "Milano, Torino (Jan)-Compressed"

aksi halde mutlak yol verin:

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

Dosya adında çift bir alıntı varsa o zaman ile kaçış \"


Başında eğik çizgiyle bir yol başlatırsanız, kökten gider. Bunu kaldırmak isteyebilirsin.
isaaclw

@isaaclw Bu yüzden mutlak bir yolla

1
Ah, "değişken" bir klasörü gösteren üç nokta. "Ana klasör" olduğunu belirten iki nokta olduğunu varsaydım. Özür dilemek.
isaaclw

3

Bu durumda en iyisi olmasa da bir diğer seçenek joker karakterleri kullanmaktır. Deneyebilirsin:

cd *Torino*

Başkaları tarafından paylaşılmayan bir dizin adına ayrı bir kelime veya kelime öbeği olduğunda bu yöntemi kullanmak en iyisidir. Örneğin / media / DataSSD ve / media / DataHDD bağlantı noktalarım var. Otomatik tamamlama, ismimin neredeyse yarısını yazana kadar çalışmaz, bu yüzden sadece HDD bölümüme ulaşmak için yazarım

cd /media/*HD*

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.