Как ввести имя файла или каталога, содержащее пробелы или специальные символы в терминале? [dубликат]

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

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

Я ввожу имена файлов или каталогов, которые содержат специальные символы в терминале вообще?

35
задан 13 June 2018 в 18:08

16 ответов

Эта команда неоднозначна, поскольку пробелы обычно используются для разделения аргументов. cd не знает, что вы хотите сделать, но у вас есть две возможности для его решения:

Либо вы «маскируете» пробелы (и все другие специальные символы), чтобы терминал знал, что вы имеете в виду пространство как символ, а не как разделитель:

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

Или вы поместите свое имя папки или путь в маску :

cd "Milano, Torino (Jan)-Compressed"
37
ответ дан 18 July 2018 в 01:29

Эта команда неоднозначна, поскольку пробелы обычно используются для разделения аргументов. cd не знает, что вы хотите сделать, но у вас есть две возможности для его решения:

Либо вы «маскируете» пробелы (и все другие специальные символы), чтобы терминал знал, что вы имеете в виду пространство как символ, а не как разделитель:

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

Или вы поместите свое имя папки или путь в маску :

cd "Milano, Torino (Jan)-Compressed"
37
ответ дан 24 July 2018 в 17:24

tl; dr: Чтобы процитировать специальный символ, либо вывести его с помощью обратного слэша \, либо заключить его в двойные " " или одинарные кавычки ' '. Вкладка ↹ Завершение заботится о правильном цитировании.

То, о чем вы просите, называется tl; dr :

Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты из man bash]

Цитирование с escape-символом \

Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты, взятые из man bash]

Некабельная обратная косая черта (\) является символом escape. Он сохраняет литеральное значение следующего следующего символа, за исключением <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 'Programmable Completion (aka Tab ↹ Completion) автоматически экранирует специальные символы с escape-символом \.

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

So для входа в каталог или файл со специальным символом выведите хотя бы последнюю или большую часть вашего имени файла или пути с двойными кавычками, например:

Цитирование с одинарными кавычками ' '

Прикрепленные символы в двойных кавычках сохраняют буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено, !.

Поскольку $, ` и ! сохраняют свое особое значение внутри двойных кавычек, Программируемое завершение , Замена команд, Расширение арифметики и расширение истории выполняются по строкам с двойными кавычками.

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

Вложения символов в одинарных кавычках сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

21
ответ дан 18 July 2018 в 01:29

Чтобы открыть папку с пространством, окружающим ее в кавычках, например cd "Some Directory" или вывести пробел с обратным слэшем, например: cd /home/kudic/Radna\ površina.

6
ответ дан 18 July 2018 в 01:29

Запишите его как

cd 'Milano, Torino (Jan)-Compressed'

В противном случае он обрабатывает Milano, как имя папки. Это происходит из-за пробелов в имени папки.

Кроме того, вы можете избежать некоторых специальных символов ...

cd Milano\,\ Torino\ \(Jan\)-Compressed/
23
ответ дан 18 July 2018 в 01:29

C-подобные строки и $ 'string'

Среди прочего можно использовать тип цитирования $'...' для использования символов обратной косой черты ANSI-C, таких как \n и \t , включая те, которые вы упомянули. Из bash 4.3 manual:

Слова формы $ 'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как указано в стандарте ANSI C.

Это особенно полезно для файлов, которые содержат символы новой строки, вкладки, когда вы пишете сложные строки awk, где вам нужно использовать разные способы различения одиночных и двойных кавычек, когда сами имена файлов содержат одиночные / двойная кавычка mishmash и т. д.

Например, создание и перечисление таких файлов:

$ 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

Такая же идея, как и прежде, - использовать escape-символы:

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

Использовать inodes:

Каждый файл или каталог имеет специальные данные связанная с ним структура, называемая 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

Избегайте обращаться с отдельными файлами, когда вы можете использовать glob

Когда вам не нужно иметь дело с отдельными файлами, просто используйте символ * glob в переменных оболочки и котировки, передавая их другим командам. Это значительно упрощает работу с трудными именами файлов:

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

Обратите внимание на использование ./ - защиту от имен файлов, которые могут содержать в них ведущие -.

9
ответ дан 18 July 2018 в 01:29

Если этот каталог находится в вашей домашней папке, тогда введите:

cd "Milano, Torino (Jan)-Compressed"

else укажите абсолютный путь:

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

, если в имени файла есть двойная кавычка, тогда escape что с \"

3
ответ дан 18 July 2018 в 01:29

Другим вариантом, хотя и не лучшим в этом случае, является использование подстановочных знаков. Вы можете попробовать:

cd *Torino*

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

cd /media/*HD*

3
ответ дан 18 July 2018 в 01:29

Маленький совет: завершение вкладки:)

Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab. Терминал поможет вам, выполнив остальные слова.

Другой способ: tab complete и drop

Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab , Терминал поможет вам, выполнив остальные слова.
22
ответ дан 18 July 2018 в 01:29

tl; dr: Чтобы процитировать специальный символ, либо вывести его с помощью обратного слэша \, либо заключить его в двойные " " или одинарные кавычки ' '. Вкладка ↹ Завершение заботится о правильном цитировании.

То, о чем вы просите, называется tl; dr :

Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты из man bash]

Цитирование с escape-символом \

Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты, взятые из man bash]

Некабельная обратная косая черта (\) является символом escape. Он сохраняет литеральное значение следующего следующего символа, за исключением <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 'Programmable Completion (aka Tab ↹ Completion) автоматически экранирует специальные символы с escape-символом \.

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

So для входа в каталог или файл со специальным символом выведите хотя бы последнюю или большую часть вашего имени файла или пути с двойными кавычками, например:

Цитирование с одинарными кавычками ' '

Прикрепленные символы в двойных кавычках сохраняют буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено, !.

Поскольку $, ` и ! сохраняют свое особое значение внутри двойных кавычек, Программируемое завершение , Замена команд, Расширение арифметики и расширение истории выполняются по строкам с двойными кавычками.

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

Вложения символов в одинарных кавычках сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

21
ответ дан 24 July 2018 в 17:24
  • 1
    '\' ломает синтаксис синтаксиса оболочки SE. – David Foerster 31 December 2017 в 00:35
  • 2
    @DavidFoerster Существует предел google prettify (который используется для этого), но я думал лучше, чем ничего ... Как насчет сейчас? ;П – dessert 31 December 2017 в 00:40
  • 3
    Это было скорее утверждение факта и немного неожиданности, чем критика вашего поста. Единственная критика здесь может пойти на синтаксический ярлык. Я бы ничего не сделал об этом лично. – David Foerster 31 December 2017 в 00:41

Чтобы открыть папку с пространством, окружающим ее в кавычках, например cd "Some Directory" или вывести пробел с обратным слэшем, например: cd /home/kudic/Radna\ površina.

6
ответ дан 24 July 2018 в 17:24
  • 1
    Или выйдите из пространства с обратной косой чертой, например: cd /home/kudic/Radna\ površina – Timo 10 July 2012 в 18:43
  • 2
    Отличный момент! Я забыл упомянуть об этом. Обычно я использую кавычки по привычке, но обратная косая черта на самом деле лучше использовать в конечном итоге. – Corey Whitaker 10 July 2012 в 18:45
  • 3
    Или используйте одинарные кавычки ('Radna površina'), если вы не хотите, чтобы переменные среды ($VARNAME) расширялись, а команды, заключенные в backticks или $() для запуска (или если в имени файла есть двойные кавычки) , – Eliah Kagan 10 July 2012 в 18:49

Запишите его как

cd 'Milano, Torino (Jan)-Compressed'

В противном случае он обрабатывает Milano, как имя папки. Это происходит из-за пробелов в имени папки.

Кроме того, вы можете избежать некоторых специальных символов ...

cd Milano\,\ Torino\ \(Jan\)-Compressed/
23
ответ дан 24 July 2018 в 17:24
  • 1
    Вы также можете использовать Tab для автоматического завершения внутри двойных кавычек для автоматического спуска двойных кавычек в имени файла. – htorque 5 February 2012 в 18:06
  • 2
    Обратите внимание, что двойные кавычки не помогут вам cd в каталог с именем $money, например. Вам нужно будет написать '$money' или \$money. – Dietrich Epp 6 February 2012 в 02:22
  • 3
    Я думаю, что в целом одинарные кавычки более явны и имеют более высокий стандарт. Оба работают, но одиночные кавычки работают чаще и говорят «точно так, как вы его видите». – isaaclw 6 February 2012 в 03:50
  • 4
    @isaaclw Спасибо, согласен! Ред. – Prateek 6 February 2012 в 20:14

C-подобные строки и $ 'string'

Среди прочего можно использовать тип цитирования $'...' для использования символов обратной косой черты ANSI-C, таких как \n и \t , включая те, которые вы упомянули. Из bash 4.3 manual:

Слова формы $ 'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как указано в стандарте ANSI C.

Это особенно полезно для файлов, которые содержат символы новой строки, вкладки, когда вы пишете сложные строки awk, где вам нужно использовать разные способы различения одиночных и двойных кавычек, когда сами имена файлов содержат одиночные / двойная кавычка mishmash и т. д.

Например, создание и перечисление таких файлов:

$ 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

Такая же идея, как и прежде, - использовать escape-символы:

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

Использовать inodes:

Каждый файл или каталог имеет специальные данные связанная с ним структура, называемая 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

Избегайте обращаться с отдельными файлами, когда вы можете использовать glob

Когда вам не нужно иметь дело с отдельными файлами, просто используйте символ * glob в переменных оболочки и котировки, передавая их другим командам. Это значительно упрощает работу с трудными именами файлов:

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

Обратите внимание на использование ./ - защиту от имен файлов, которые могут содержать в них ведущие -.

9
ответ дан 24 July 2018 в 17:24

Если этот каталог находится в вашей домашней папке, тогда введите:

cd "Milano, Torino (Jan)-Compressed"

else укажите абсолютный путь:

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

, если в имени файла есть двойная кавычка, тогда escape что с \"

3
ответ дан 24 July 2018 в 17:24
  • 1
    Если вы начинаете путь с ведущей косой чертой, это происходит от root. Вы можете удалить это. – isaaclw 6 February 2012 в 03:52
  • 2
    @isaaclw Вот почему он подал это как абсолютный путь: P – user 6 February 2012 в 07:16
  • 3
    Ах, это три точки, обозначающие «переменную». папка. Я предположил, что это две точки, обозначающие «родительскую папку». Извиняюсь. – isaaclw 6 February 2012 в 09:43

Другим вариантом, хотя и не лучшим в этом случае, является использование подстановочных знаков. Вы можете попробовать:

cd *Torino*

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

cd /media/*HD*

3
ответ дан 24 July 2018 в 17:24

Маленький совет: завершение вкладки:)

Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab. Терминал поможет вам, выполнив остальные слова.

Другой способ: tab complete и drop

Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab , Терминал поможет вам, выполнив остальные слова.
22
ответ дан 24 July 2018 в 17:24
  • 1
    Получил любовь tab завершение & lt; 3 – Rinzwind 5 February 2012 в 21:39
  • 2
    Хотя принятый ответ технически корректен, на практике вам захочется выполнить табуляцию, чтобы вам не нужно было все это ускользать. – phasetwenty 10 February 2012 в 03:32
  • 3
    @Achu, но иногда даже сама закладка не работает для каталогов, содержащих специальные символы, то есть - и т. Д., Поэтому предлагаемый метод будет cd -- '-foo-/'. но все же мы можем использовать вкладку в цитате;) – Amir 10 January 2014 в 20:05

Другие вопросы по тегам:

Похожие вопросы: