Невозможно удалить файл
Я не могу удалить файл:
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
Поскольку некоторые редкие команды не принимают кавычки, вам лучше знать о \,