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

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

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

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

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

8 ответов

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

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

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

Или введите имя папки или путь в кавычки :

cd "Milano, Torino (Jan)-Compressed"
51
ответ дан 13 June 2018 в 18:08

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

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

Другой способ: перетащите и dr op

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

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

cd 'Milano, Torino (Jan)-Compressed'

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

cd Milano\,\ Torino\ \(Jan\)-Compressed/
24
ответ дан 13 June 2018 в 18:08

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

cd *Torino*

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

cd /media/*HD*

3
ответ дан 13 June 2018 в 18:08

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

6
ответ дан 13 June 2018 в 18:08

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

cd "Milano, Torino (Jan)-Compressed"

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

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

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

3
ответ дан 13 June 2018 в 18:08

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


То, что вы просите, называется Цитата :

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

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

Обратная косая черта без кавычек ( \ ) - это escape-символ. Он сохраняет буквальное значение следующего символа, за исключением <новая строка> .

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

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

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

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

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

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

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 .

22
ответ дан 13 June 2018 в 18:08

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

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

Слова формы $ 'строка' обрабатываются особым образом. Слово расширяется в строку, с заменой символов с обратной косой чертой, как указано по стандарту 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'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, на которую ссылаются с помощью определенного десятичного числа. Таким образом, вы можете использовать это, чтобы косвенно найти файл с конкретным индексным дескриптором с помощью команды 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

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

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

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

10
ответ дан 13 June 2018 в 18:08

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

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