Я хочу ввести следующую папку в терминале:
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 ?
( ) * ? \
Как мне ввести файл или имена каталогов, которые содержат специальные символы в терминале в целом?
Эта команда неоднозначна, потому что для разделения аргументов обычно используются пробелы. cd не знает, что вы хотите сделать, но у вас есть две возможности решить эту проблему:
Либо вы « маскируете » пробелы (и все другие специальные символы), чтобы терминал знал, что вы имеете в виду пробел как символ, а не как разделитель:
cd Milano\,\ Torino\ \(Jan\)-Compressed
Или введите имя папки или путь в кавычки :
cd "Milano, Torino (Jan)-Compressed"
Небольшой совет: завершение вкладки ; -)
cd Mi
(или несколько букв, если необходимо) и нажмите Tab . Терминал поможет вам, заполнив остальные слова. Другой способ: перетащите и dr op
cd
, а затем перетащите каталог на терминал и нажмите введите . Запишите его как:
cd 'Milano, Torino (Jan)-Compressed'
В противном случае он рассматривает Milano,
как имя папки. Это происходит из-за пробелов в названии папки. В качестве альтернативы избегайте нескольких специальных символов:
cd Milano\,\ Torino\ \(Jan\)-Compressed/
Другой вариант, хотя и не самый лучший в данном случае, это использование подстановочных символов. Можно попробовать:
cd *Torino*
Лучше всего использовать этот метод, когда в имени директории, не разделяемой другими, есть отдельное слово или фраза. Например, у меня есть точки монтирования /media/DataSSD и /media/DataHDD. Автозавершение не работает, пока я не введу почти половину имени, поэтому, чтобы попасть на раздел жесткого диска, я просто набираю
cd /media/*HD*
Чтобы открыть папку, содержащую пробел, заключите ее в кавычки например cd "Some Directory"
или экранируйте пробел с помощью обратной косой черты, например: cd / home / kudic / Radna \ površina
.
Если этот каталог находится в вашей домашней папке, введите:
cd "Milano, Torino (Jan)-Compressed"
иначе укажите абсолютный путь:
cd "/…/…/Milano, Torino (Jan)-Compressed"
если есть двойные кавычки в имени файла затем экранируйте это с помощью \ "
tl; dr : чтобы заключить специальный символ в кавычки, либо экранируйте его обратной косой чертой \
, либо заключите его в двойной ""
или одинарный цитаты »
. Вкладка ↹ Завершение заботится о правильном цитировании.
То, что вы просите, называется Цитата :
Цитирование используется для удаления специального значения определенных символов или слов в оболочку. (…) Существует три механизма кавычек: escape-символ , одинарные кавычки и двойные кавычки . [цитаты взяты из
man bash
]
\
Обратная косая черта без кавычек (
\
) - это 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 .
Среди прочего, можно использовать тип цитирования $ '...'
, чтобы использовать 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
Та же идея, что и раньше -Воспользуйтесь преимуществами escape-символов:
$ ls "$(printf "file\x28name")"
file(name
$ echo "Hello World" > c$'\n'd
$ cat "$(printf "c\nd")"
Hello World
Каждый файл или каталог имеет связанную с ним специальную структуру данных, называемую 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
Обратите внимание на использование ./
- защиты от имен файлов, которые могут содержать в себе ведущие -
.