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

44

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

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

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

Pomario
источник

Ответы:

44

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

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

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

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

cd "Milano, Torino (Jan)-Compressed"
krystoph
источник
26

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

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

Другой способ: перетащить и падение

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

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

cd 'Milano, Torino (Jan)-Compressed'

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

cd Milano\,\ Torino\ \(Jan\)-Compressed/
Prateek
источник
22

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


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

Цитирование используется для удаления специального значения определенных символов или слов в оболочке. (…) Существует три механизма цитирования: 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«S Программируемая Завершение (ака Tab ↹Завершение) автоматически экранирует специальные символы с экранирующим символом \.

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

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

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

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 , на wiki.bash-hackers.org и на tldp.org .

Десерт
источник
10

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

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

Сергей Колодяжный
источник
6

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

Кори Уитакер
источник
3
Или покинуть пространство с обратной косой чертой, как:cd /home/kudic/Radna\ površina
Тимо
Отличный момент! Я забыл упомянуть об этом. Я обычно использую кавычки по привычке, но на самом деле лучше использовать обратную косую черту.
Кори Уитакер
1
Или используйте одиночные кавычки ( 'Radna površina'), если вы не хотите, чтобы переменные окружения ( $VARNAME) расширялись, а команды заключались в обратные кавычки или $()выполнялись (или если в имени файла есть двойные кавычки).
Элия ​​Каган
3

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

cd "Milano, Torino (Jan)-Compressed"

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

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

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

Харшвир Сингх
источник
Если вы начинаете путь с передней косой черты, он идет от корня. Вы можете удалить это.
isaaclw
@isaaclw Вот почему он записал его как абсолютный путь: P
1
Ах, это три точки, указывающие на «переменную» папку. Я предположил, что это были две точки, обозначающие «родительскую папку». Извиняюсь.
isaaclw
3

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

cd *Torino*

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

cd /media/*HD*

user242845
источник