Невозможно удалить файл

Я не могу удалить файл:

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'

(Я выделил курсивом те части приведенных выше команд, которые указаны в кавычках, поэтому ' можно увидеть.)

При цитировании с ', только ' лечится специально. Он всегда соответствует закрывающей кавычке.

Напротив, цитирование с двойными кавычками, как это широко рекомендуется (даже если в этом нет необходимости), обычно работает, но работает в соответствии с довольно сложными правилами.

Ручное цитирование с "

Есть три распространенных случая, когда цитирование " используется в предпочтении над ',

  1. Почему-то многие люди стилистически предпочитают ", Это не обязательно неправильно или нежелательно, но я рекомендую не отдавать предпочтение " если вы не знакомы и не знакомы с правилами, какие расширения оболочки она делает и не мешает.

  2. Когда ваше выражение содержит один символ кавычки ('), это не может быть заключено в одинарные кавычки, но может быть заключено в двойные кавычки. И как ', " цитирование удаляет специальное значение из пробелов, табуляции, переносов (разрывов строк), ( а также ), { а также }, < а также >, ;, &, |, ?, *, ~ а также #, (И, возможно, другие символы, в зависимости от того, забыл ли я что-нибудь и от того, какие параметры оболочки включены.) Например:

    du -h "Don't Ask Me Why (Eurythmics, 1989).flac"
    

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

  3. Однако в отличие от ' цитируя " не удаляет особое значение из $, `, \ и (если расширение истории не отключено) !, (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"\!\!

Это может сочетаться с и может рассматриваться как вариант цитирования только части аргумента, как обсуждалось выше.

Источники / Дальнейшее чтение

Пробелы не допускаются в терминале, потому что они разделяют разные части команды. Так что для имен файлов с пробелами вы должны использовать кавычки, как сказал @Cornelius, или \ перед каждым пробелом:

sudo rm /usr/local/bin/Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part

Поскольку некоторые редкие команды не принимают кавычки, вам лучше знать о \,

Другие вопросы по тегам