Как мне ввести файл или каталог со специальными символами в названии?
Я хочу ввести следующую папку в терминале:
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 ?
( ) * ? \
Как мне ввести имена файлов или каталогов, которые содержат специальные символы в терминале в целом?
8 ответов
Эта команда неоднозначна, потому что пробелы обычно используются для разделения аргументов. CD не знает, что вы хотите сделать, но у вас есть две возможности решить это:
Либо вы "маскируете" пробелы (и все другие специальные символы), чтобы терминал знал, что вы подразумеваете пробел как символ, а не как разделитель:
cd Milano\,\ Torino\ \(Jan\)-Compressed
Или вы вводите имя вашей папки или путь в кавычки:
cd "Milano, Torino (Jan)-Compressed"
Небольшой совет: пополнение вкладки;-)
- Просто введите первую букву, например
cd Mi
(или несколько букв, если необходимо) и нажмите Tab. Терминал поможет вам, заполнив остальные слова.
Другой способ: перетаскивание
- Если вы видите каталог и хотите получить к нему доступ через терминал, просто наберите:
cd
затем перетащите каталог на терминал и нажмите ввод.
Напишите это как:
cd 'Milano, Torino (Jan)-Compressed'
В противном случае это лечит Milano,
как имя папки. Это происходит из-за пробелов в имени папки. В качестве альтернативы экранируйте несколько специальных символов:
cd Milano\,\ Torino\ \(Jan\)-Compressed/
tl; dr: чтобы заключить в кавычки специальный символ, либо экранируйте его обратной косой чертой \
или приложить его в двойном " "
или одинарные кавычки ' '
, Вкладка ↹ Завершение заботится о правильном цитировании.
То, что вы просите, называется цитированием:
Цитирование используется для удаления специального значения определенных символов или слов в оболочке. (…) Существует три механизма цитирования: escape-символ, одинарные и двойные кавычки. [цитаты взяты из
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
Программируемое завершение (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 “?”
Как $
, `
а также !
сохранить их специальное значение в двойных кавычках, расширение строк, подстановка команд, арифметическое расширение и расширение истории выполняются для строк в двойных кавычках.
Цитирование в одинарных кавычках ' '
Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.
Таким образом, чтобы ввести каталог или файл со специальным символом, экранируйте по крайней мере последний или большую часть вашего имени файла или пути в двойных кавычках, например:
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, на http://wiki.bash-hackers.org/syntax/quoting и на 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'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
Избегайте работы с отдельными файлами, когда вы можете использовать glob
Когда вам не нужно иметь дело с отдельными файлами, просто воспользуйтесь *
Глобальный символ в оболочке и кавычки переменных при передаче их другим командам. Это облегчает работу со сложными именами файлов:
$ for f in ./*; do echo "$f" ; done
file name2
file(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*