Невозможно удалить файл
Я не могу удалить файл:
sudo rm /usr/local/bin/Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part
Это показывает ошибку:
bash: syntax error near unexpected token `('
Как это исправить?
2 ответа
Завершение вкладки
Если у вас есть только один файл в /usr/local/bin
чье имя начинается с Katy
, вы можете просто напечатать
sudo rm /usr/local/bin/Katy
без нажатия Enter еще. Затем нажмите клавишу Tab, чтобы выполнить команду:
sudo rm Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part
(И затем нажмите Enter, чтобы запустить его.)
Он цитирует каждого персонажа индивидуально (как в ответе Алины) и делает это автоматически, чтобы вы ничего не пропустили.
На практике большое количество цитирования, которое мы делаем в командной строке, фактически достигается автоматически с завершением табуляции.
Также обратите внимание, что завершение табуляции не ограничивается ситуациями, когда что-то должно быть заключено в кавычки. Например, UUID как 8d44cd38-2158-42f4-9af1-94cd3ccbb9a8
не нужно указывать, но если это единственная возможность, начиная с 8
(или с некоторой более длинной исходной правильной подпоследовательностью), завершение табуляции может быть очень удобно для составления команды, содержащей его.
Вы также можете вручную цитировать, в этом случае вы хотите узнать о других способах цитирования, чем \
Для таких случаев, как этот, где нужно процитировать много символов и легко допустить ошибки.
Ручное цитирование с '
Если вы хотите, чтобы выражение отображалось буквально, а выражение не содержит символ одинарной кавычки ('
) хорошая привычка заключать в кавычки, используя одинарные кавычки.
sudo rm '/usr/local/bin/Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part'
Вы можете процитировать весь аргумент или только его часть. Например, это тоже работает:
sudo rm /usr/local/bin/'Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part'
Или даже:
sudo rm /usr/local/bin/Katy' Perry - Dark Horse (Official) ft. Juicy 'J-0KSOMA3QBU0.mp4.part'
(Я выделил курсивом те части приведенных выше команд, которые указаны в кавычках, поэтому '
можно увидеть.)
При цитировании с '
, только '
лечится специально. Он всегда соответствует закрывающей кавычке.
Напротив, цитирование с двойными кавычками, как это широко рекомендуется (даже если в этом нет необходимости), обычно работает, но работает в соответствии с довольно сложными правилами.
Ручное цитирование с "
Есть три распространенных случая, когда цитирование "
используется в предпочтении над '
,
Почему-то многие люди стилистически предпочитают
"
, Это не обязательно неправильно или нежелательно, но я рекомендую не отдавать предпочтение"
если вы не знакомы и не знакомы с правилами, какие расширения оболочки она делает и не мешает.Когда ваше выражение содержит один символ кавычки (
'
), это не может быть заключено в одинарные кавычки, но может быть заключено в двойные кавычки. И как'
,"
цитирование удаляет специальное значение из пробелов, табуляции, переносов (разрывов строк),(
а также)
,{
а также}
,<
а также>
,;
,&
,|
,?
,*
,~
а также#
, (И, возможно, другие символы, в зависимости от того, забыл ли я что-нибудь и от того, какие параметры оболочки включены.) Например:du -h "Don't Ask Me Why (Eurythmics, 1989).flac"
Таким образом, двойные кавычки прекрасно работают для конкретного файла, который вы удаляете - имя которого содержит специальные символы
(
,)
и пространство - и предложение использовать их в этом случае было и полезно, и совершенно нормально.Однако в отличие от
'
цитируя"
не удаляет особое значение из$
,`
,\
и (если расширение истории не отключено)!
, (Nor"
, что, как и следовало ожидать, интерпретируется как закрывающая двойная кавычка. Обычно.)"
цитирование, таким образом, полезно, когда вы не хотите, чтобы оболочка не выполняла расширения, основанные на значении этих символов. Например, бегf='fee fi fo'
с последующимcat "$f fum.txt"
печатает содержимоеfee fi fo fum.txt
,Но когда такое поведение непредвиденное, оно может вызвать проблемы:
$ du -sh ... $ rm "Stupid Scheme to Make $$$$$$ Quick!!!!.pdf" rm "Stupid Scheme to Make $$$$$$ Quickdu -shdu -sh.pdf" rm: cannot remove ‘Stupid Scheme to Make 453745374537 Quickdu -shdu -sh.pdf’: No such file or directory
Персонажи, которые сохраняют свое особое значение в
"
сами цитаты могут цитироваться, если им предшествует\
:$ echo "\"Windows uses '\\' as the path separator,\" screeched Multiplatform Owl wisely." "Windows uses '\' as the path separator," screeched Multiplatform Owl wisely.
Когда без кавычек
\
предшествует символу, который не нуждается в дальнейшем цитировании, он остается неизменным. (Таким образом,\\
в приведенной выше команде могло бы быть просто\
.)Внутри двойных кавычек,
\
до!
снимает это особое значение (то есть предотвращает расширение истории). Но в отличие от когда\
цитирует другие специальные символы,\
до!
не удаляется. Таким образом,\!
интерпретируется как буквальный\!
, в то время как\$
интерпретируется как буквальный$
а также\
прежде чем пространство интерпретируется как буквальное пространство.
Ручное цитирование с \
\
цитирует один символ, за ним сразу следует символ. (За исключением, конечно, когда оно само цитируется.)
Для большинства персонажей x
, \x
эквивалентно x
, \
особенно полезно, когда следующий за ним символ имеет особое значение - он удаляет специальное значение из этого символа:
$ rm -v Stupid\ Scheme\ to\ Make\ \$\$\$\$\$\$\ Quick\!\!\!\!.pdf
removed ‘Stupid Scheme to Make $$$$$$ Quick!!!!.pdf’
когда \
заключено в двойные кавычки ("
), это работает по-другому, как описано выше. В этом случае он имеет особое значение только в том случае, если следующий символ является специальным, а иначе интерпретируется буквально.
Написание команд вручную \
Это особенно полезно и целесообразно, когда вам не нужно использовать очень много из них, а в противном случае может быть несколько неэффективным.
Например:
ek@Ilex:~$ pastebinit <<< Hello,\ world!
http://paste.ubuntu.com/8390449/
(Один !
символ в конце аргумента не нужно заключать в кавычки.)
Объединение различных форм цитирования
Предположим, вы хотели couldn't wouldn't shouldn't can't won't don't!!
появляться буквально. Самый простой способ добиться этого - процитировать это так:
"couldn't wouldn't shouldn't can't won't don't"'!!'
Или (так как \
до !
удаляется только в двойных кавычках):
"couldn't wouldn't shouldn't can't won't don't"\!\!
Это может сочетаться с и может рассматриваться как вариант цитирования только части аргумента, как обсуждалось выше.
Источники / Дальнейшее чтение
- Справочное руководство Bash (см. Эту страницу для других форматов)
man bash
(aka bash(1), страница руководства bash)
Пробелы не допускаются в терминале, потому что они разделяют разные части команды. Так что для имен файлов с пробелами вы должны использовать кавычки, как сказал @Cornelius, или \
перед каждым пробелом:
sudo rm /usr/local/bin/Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part
Поскольку некоторые редкие команды не принимают кавычки, вам лучше знать о \
,