Я хочу ввести следующую папку в терминал:
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 не знает, что вы хотите сделать, но у вас есть две возможности для его решения:
Либо вы «маскируете» пробелы (и все другие специальные символы), чтобы терминал знал, что вы имеете в виду пространство как символ, а не как разделитель:
cd Milano\,\ Torino\ \(Jan\)-Compressed
Или вы поместите свое имя папки или путь в маску :
cd "Milano, Torino (Jan)-Compressed"
tl; dr: Чтобы процитировать специальный символ, либо вывести его с помощью обратного слэша \, либо заключить его в двойные " " или одинарные кавычки ' '. Вкладка ↹ Завершение заботится о правильном цитировании.
То, о чем вы просите, называется tl; dr :
Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты из man bash]Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: 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 'Programmable Completion (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 “?”
So для входа в каталог или файл со специальным символом выведите хотя бы последнюю или большую часть вашего имени файла или пути с двойными кавычками, например:
Прикрепленные символы в двойных кавычках сохраняют буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено, !.
Поскольку $, ` и ! сохраняют свое особое значение внутри двойных кавычек, Программируемое завершение , Замена команд, Расширение арифметики и расширение истории выполняются по строкам с двойными кавычками.
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 “\”
Вложения символов в одинарных кавычках сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.
Чтобы открыть папку с пространством, окружающим ее в кавычках, например cd "Some Directory" или вывести пробел с обратным слэшем, например: cd /home/kudic/Radna\ površina.
Запишите его как
cd 'Milano, Torino (Jan)-Compressed'
В противном случае он обрабатывает Milano, как имя папки. Это происходит из-за пробелов в имени папки.
Кроме того, вы можете избежать некоторых специальных символов ...
cd Milano\,\ Torino\ \(Jan\)-Compressed/
Среди прочего можно использовать тип цитирования $'...' для использования символов обратной косой черты ANSI-C, таких как \n и \t , включая те, которые вы упомянули. Из bash 4.3 manual:
Слова формы $ 'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как указано в стандарте ANSI C.Это особенно полезно для файлов, которые содержат символы новой строки, вкладки, когда вы пишете сложные строки awk, где вам нужно использовать разные способы различения одиночных и двойных кавычек, когда сами имена файлов содержат одиночные / двойная кавычка mishmash и т. д.
Например, создание и перечисление таких файлов:
$ 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, на которую ссылается определенное десятичное число. Таким образом, вы можете использовать это, чтобы косвенно найти файл с конкретным 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 "Milano, Torino (Jan)-Compressed"
else укажите абсолютный путь:
cd "/…/…/Milano, Torino (Jan)-Compressed"
, если в имени файла есть двойная кавычка, тогда escape что с \"
Другим вариантом, хотя и не лучшим в этом случае, является использование подстановочных знаков. Вы можете попробовать:
cd *Torino*
Лучше всего использовать этот метод, когда есть определенное слово или фраза во имя каталога, не разделенного другими. Например, у меня есть точки монтирования / media / DataSSD и / media / DataHDD. Автозаполнение не работает, пока я не наберу почти половину имени, поэтому, чтобы перейти на мой раздел жесткого диска, я просто набираю
cd /media/*HD*
Маленький совет: завершение вкладки:)
Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab. Терминал поможет вам, выполнив остальные слова.Другой способ: tab complete и drop
Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab , Терминал поможет вам, выполнив остальные слова.tl; dr: Чтобы процитировать специальный символ, либо вывести его с помощью обратного слэша \, либо заключить его в двойные " " или одинарные кавычки ' '. Вкладка ↹ Завершение заботится о правильном цитировании.
То, о чем вы просите, называется tl; dr :
Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки. [цитаты из man bash]Цитата используется для удаления специального значения определенных символов или слов в оболочке. (...) Существует три механизма цитирования: 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 'Programmable Completion (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 “?”
So для входа в каталог или файл со специальным символом выведите хотя бы последнюю или большую часть вашего имени файла или пути с двойными кавычками, например:
Прикрепленные символы в двойных кавычках сохраняют буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено, !.
Поскольку $, ` и ! сохраняют свое особое значение внутри двойных кавычек, Программируемое завершение , Замена команд, Расширение арифметики и расширение истории выполняются по строкам с двойными кавычками.
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 “\”
Вложения символов в одинарных кавычках сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.
Чтобы открыть папку с пространством, окружающим ее в кавычках, например cd "Some Directory" или вывести пробел с обратным слэшем, например: cd /home/kudic/Radna\ površina.
Запишите его как
cd 'Milano, Torino (Jan)-Compressed'
В противном случае он обрабатывает Milano, как имя папки. Это происходит из-за пробелов в имени папки.
Кроме того, вы можете избежать некоторых специальных символов ...
cd Milano\,\ Torino\ \(Jan\)-Compressed/
Среди прочего можно использовать тип цитирования $'...' для использования символов обратной косой черты ANSI-C, таких как \n и \t , включая те, которые вы упомянули. Из bash 4.3 manual:
Слова формы $ 'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как указано в стандарте ANSI C.Это особенно полезно для файлов, которые содержат символы новой строки, вкладки, когда вы пишете сложные строки awk, где вам нужно использовать разные способы различения одиночных и двойных кавычек, когда сами имена файлов содержат одиночные / двойная кавычка mishmash и т. д.
Например, создание и перечисление таких файлов:
$ 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, на которую ссылается определенное десятичное число. Таким образом, вы можете использовать это, чтобы косвенно найти файл с конкретным 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 "Milano, Torino (Jan)-Compressed"
else укажите абсолютный путь:
cd "/…/…/Milano, Torino (Jan)-Compressed"
, если в имени файла есть двойная кавычка, тогда escape что с \"
Другим вариантом, хотя и не лучшим в этом случае, является использование подстановочных знаков. Вы можете попробовать:
cd *Torino*
Лучше всего использовать этот метод, когда есть определенное слово или фраза во имя каталога, не разделенного другими. Например, у меня есть точки монтирования / media / DataSSD и / media / DataHDD. Автозаполнение не работает, пока я не наберу почти половину имени, поэтому, чтобы перейти на мой раздел жесткого диска, я просто набираю
cd /media/*HD*
Маленький совет: завершение вкладки:)
Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab. Терминал поможет вам, выполнив остальные слова.Другой способ: tab complete и drop
Просто введите первую букву, например cd Mi (или, если необходимо, несколько букв) и нажмите Tab , Терминал поможет вам, выполнив остальные слова.