Как мне ввести файл или каталог со специальными символами в его названии?

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

Milano, Torino (Jan)-Compressed

Как я должен написать команду cd чтобы войти в этот каталог?

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

$ cd space dirbash: cd: space: No such file or directory$ cat space filecat: space: No such file or directorycat: file: No such file or directory$ cat (bash: syntax error near unexpected token `newline'$ echo content >\> ^C$ ls ?(  )  *  ?  \

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

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

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

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

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

cd "Milano, Torino (Jan)-Compressed"

Небольшой совет: завершение вкладки ;-)

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

Другой способ: тащить и капля

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

Запишите это как:

cd 'Milano, Torino (Jan)-Compressed'

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

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

тл;д-р: Чтобы заключить специальный символ в кавычки, либо экранируйте его с помощью обратной косой черты \ или заключите его в двойную " " или одинарные кавычки ' '. 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Программируемое Завершение (он же Tab ↹ Завершение) автоматически экранирует специальные символы с помощью escape-символа \.

Кавычки в двойных кавычках " "

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

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

cd space" "dir     # change into directory called “space dir”cd spac"e di"r     # equallycd "space dir"     # equallycat "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     # equalcd 'space dir'     # equalcat '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/ЦИТИРОВАНИЕ, на wiki.bash-hackers.org и дальше tldp.org.

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

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

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

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

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

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

Вы можете использовать символьные шестнадцатеричные значения, такие как:

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

printf

Та же идея, что и раньше - воспользуйтесь преимуществами escape-символов:

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

Используйте индексы:

С каждым файлом или каталогом связана специальная структура данных, называемая индексом, на которую ссылается определенное десятичное число. Таким образом, вы можете использовать это для косвенного поиска файла с определенным индексом с помощью find командуйте и делайте что-нибудь с этим:

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

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

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

$ for f in ./*; do echo "$f" ; donefile    name2file(name1

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

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

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

cd "Milano, Torino (Jan)-Compressed"

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

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

если в имени файла есть двойная кавычка, то экранируйте ее с помощью \"

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

cd *Torino*

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

cd /media/*HD*

По теме: Раздел 3.1.2. Цитирование из [справочного руководства по Bash](GNU Bash manual - GNU Project - Free Software Foundation /).

О синтаксической магии “кавычек и *” см. также bash - Getting an error cp: cannot stat when trying to copy files from one folder to another - Stack Overflow