Як ввести файл або каталог із спеціальними символами на його ім'я?


44

Я хочу ввести в термінал таку папку:

Milano, Torino (Jan)-Compressed

Як мені написати команду cdдля входу в цей каталог?

Прогалини і деякі інші спеціальні символи , такі як \, *, ), (і ?проблеми , тому що коли я намагаюся використовувати їх в командному рядку або сценаріїв, наприклад:

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

Як ввести імена файлів або каталогів, які містять спеціальні символи в терміналі взагалі?


Відповіді:


43

Ця команда неоднозначна, оскільки для розділення аргументів зазвичай використовуються пробіли. CD не знає, що ви хочете зробити, але у вас є дві можливості вирішити це:

Або ви " маскуєте " пробіли (та всі інші спеціальні символи), щоб термінал знав, що ви маєте на увазі пробіл як символ, а не як роздільник:

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

Або ви додаєте назву папки або шлях у лапки :

cd "Milano, Torino (Jan)-Compressed"

26

Маленька порада: завершення вкладки ;-)

  1. Просто введіть першу букву, наприклад cd Mi(або більше літер, якщо потрібно) і натисніть Tab. Термінал допоможе вам, доповнивши решту слів.

Інший спосіб: перетягнути і падіння

  1. Якщо ви можете бачити каталог і хочете отримати доступ до нього за допомогою терміналу, просто введіть: cdспочатку, а потім перетягніть каталог на термінал і натисніть enter.

24

Напишіть це як:

cd 'Milano, Torino (Jan)-Compressed'

В іншому випадку це трактується Milano,як назва папки. Це відбувається через пробіли в назві папки. Крім того, втечі кілька спеціальних символів:

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

22

tl; dr : цитувати спеціального символу або уникнути його з косою рисою, \або укласти його в подвійні " "або одиничні лапки ' '. Tab ↹Завершення забезпечує належне котирування.


Те, що ви просите, називається цитуванням :

Цитування використовується для видалення спеціального значення певних символів або слів до оболонки. (…) Існує три механізми цитування: символ втечі , одиничні лапки та подвійні лапки . [цитати, взяті з man bash]

Цитування з персонажем втечі \

Нецитується зворотна косою рисою ( \) є символом втечі. Він зберігає буквальне значення наступного символу, що випливає, за винятком <newline>.

Отже, щоб ввести каталог або файл із спеціальним символом, уникайте останнього за допомогою \, наприклад:

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 Програмована Завершення (ака Tab ↹Завершення) автоматично екранує спеціальні символи з екрануючим символом \.

Цитування з подвійними цитатами " "

Огороджувальні символи в подвійних лапках зберігає буквальне значення всіх символів в лапках, за винятком $, `, \та, коли розкриття історії включено, !.

Отже, щоб ввести каталог або файл із спеціальним символом, уникайте принаймні останньої або більшої частини вашого імені файлу або шляху з подвійними лапками, наприклад:

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

Як $, `і !тримати їх особливе значення в подвійних лапках, параметри розширення , підстановки команд , Арифметика розширення і історія розширення виконуються на подвійних лапках.

Цитування з одинарними цитатами ' '

Замикання символів в одиничних лапках зберігає буквальне значення кожного символу в лапках. Одиночна цитата може не виникати між окремими цитатами, навіть коли передує зворотна косою рисою.

Отже, щоб ввести каталог або файл із спеціальним символом, уникайте принаймні останньої або більшої частини вашого імені файлу або шляху з подвійними лапками, наприклад:

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 bash/ QUOTING , на wiki.bash-hackers.org та на tldp.org .


10

С-подібні рядки та $ 'string'

Крім усього іншого, можна використовувати $'...'тип цитування, щоб використовувати символи зворотної косої лінії ANSI-C, такі як \nі \t, включаючи ті, про які ви згадали. З bash 4.3 керівництво:

Слова форми $ 'string "обробляються спеціально. Слово розширюється до рядка, а символи, що ухиляються від косої риски, замінюються відповідно до стандарту ANSI C.

Це особливо корисно для файлів, що містять нові рядки, вкладки, коли ви пишете складні рядки-програмі, де потрібно скористатися різними способами розрізнення одинарних та подвійних лапок, коли самі назви файлів містять мішмаш з подвійною / подвійною цитатами тощо.

Наприклад, створення та перелік таких файлів:

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

Ви можете використовувати знаки шестигранних символів, такі як:

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

printf

Така ж ідея, як і раніше - скористайтеся символами втечі:

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

Використовуйте вставки:

Кожен файл або каталог має спеціальну структуру даних, пов'язану з ним, називається inode, на яку посилається певне десяткове число. Таким чином, ви можете використовувати це для опосередкованого пошуку файлу з певним inode за допомогою findкоманди та робити щось з ним:

$ 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

Уникайте роботи з окремими файлами, коли ви можете використовувати глобус

Коли вам не доведеться мати справу з окремими файлами, просто скористайтеся *глобальним символом в оболонці та цитуйте змінні, передаючи їх іншим командам. Значно полегшує роботу зі складними іменами:

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

Зверніть увагу на використання ./захисного захисту від імен файлів, які можуть містити провідні -в них.


6

Щоб відкрити папку , яка містить пробіл оточувати його в лапки , як cd "Some Directory"і уникнути простору з зворотної косої межі, як: cd /home/kudic/Radna\ površina.


3
Або втекти з космосу за допомогою нахилу, наприклад:cd /home/kudic/Radna\ površina
Тимо

Чудова точка! Я забув це згадати. Я зазвичай використовую котирування за звичкою, але наслідок насправді краще використовувати в довгостроковій перспективі.
Corey Whitaker

1
Або використовуйте одинарні лапки ( 'Radna površina'), якщо ви не хочете, щоб змінні середовища ( $VARNAME) були розширені, а команди укладені в беккетки або $()запускалися (або якщо у імені файлу є подвійні лапки).
Елія Каган

3

Якщо цей каталог знаходиться у вашій домашній папці, тоді введіть:

cd "Milano, Torino (Jan)-Compressed"

інше дати абсолютний шлях:

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

якщо в імені файлу є подвійна цитата, тоді уникніть цього \"


Якщо ви починаєте шлях з ведучої косою косою рисою, він іде від кореня. Ви можете вилучити це.
isaaclw

@isaaclw Ось чому він подав його як абсолютний шлях: P

1
Ах, це три крапки, що вказують на папку "змінної". Я припускав, що це дві точки, що вказують на "батьківську папку". Вибачення.
isaaclw

3

Інший варіант, хоча не найкращий в цьому випадку, - це використовувати символи. Ви можете спробувати:

cd *Torino*

Найкраще використовувати цей метод, коли в імені каталогу не є чітке слово чи фраза, які не поділяються іншими. Наприклад, у мене є точки монтажу / медіа / DataSSD та / media / DataHDD. Автозавершення не працює, поки я не введу майже половину імені, щоб дістатися до свого розділу HDD, який я просто набираю

cd /media/*HD*

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.