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

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

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

Это показывает ошибку:

bash: syntax error near unexpected token `('

Как зафиксировать его?

1
задан 20 September 2014 в 22:49

2 ответа

Заполнение клавишей Tab

Если у Вас только есть один файл в /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 для выполнения его.)

Это заключает каждый символ в кавычки индивидуально (как в ответе AliNa) и делает так автоматически, таким образом, Вы ничего не пропускаете.

На практике большой объем заключения в кавычки, которое мы делаем на командной строке, на самом деле достигается автоматически с заполнением клавишей Tab.

Обратите внимание также, что заполнение клавишей Tab не ограничено ситуациями, где что-то должно было бы быть заключено в кавычки. Например, UUID как 8d44cd38-2158-42f4-9af1-94cd3ccbb9a8 не должен быть заключен в кавычки, но если это - единственная возможность, запускающаяся с 8 (или с некоторой более длинной начальной надлежащей подпоследовательностью), заполнение клавишей Tab могло быть очень удобным для создания команды, содержащей его.

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

Ручное заключение в кавычки с '

Если Вы хотите, чтобы выражение появилось буквально, и выражение не содержит одинарную кавычку characater ('), хорошая привычка войти состоит в том, чтобы заключить его в кавычки с помощью одинарных кавычек.

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. Однако, в отличие от этого, ', заключение в кавычки с " не удаляет особое значение из $, `, \, и (если расширение истории не отключено), !. (Ни ", который, как Вы ожидали бы, интерпретируется как заключительная двойная кавычка. Обычно.)

    " заключение в кавычки таким образом полезно, когда Вы не хотите препятствовать тому, чтобы оболочка выполнила расширения на основе значения тех символов. Например, выполнение 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

    Символы, которые сохраняют их особое значение в " кавычки могут самостоятельно быть заключены в кавычки, будучи предшествовавшимся a \:

    $ echo "\"Windows uses '\\' as the path separator,\" screeched Multiplatform Owl wisely."
    "Windows uses '\' as the path separator," screeched Multiplatform Owl wisely.
    

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

    В двойных кавычках, \ прежде ! удаляет его особое значение (т.е. предотвращает расширение истории). Но в отличие от когда \ заключает другие специальные символы в кавычки, a \ прежде ! не удален. Таким образом, \! интерпретируется как литерал \!, тогда как \$ интерпретируется как литерал $ и \ прежде чем пространство интерпретируется как литеральное пространство.

Ручное заключение в кавычки с \

\ заключает в кавычки отдельный символ, символ сразу после него. (Кроме, конечно, когда это самостоятельно заключается в кавычки.)

Для большинства символов 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"\!\!

С этим можно объединить и можно считать вариацией на, заключая в кавычки только часть аргумента, как обсуждено выше.

Источники / Дополнительные материалы для чтения

2
ответ дан 7 December 2019 в 14:06

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

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

, Так как некоторые редкие команды doesn’t принимают, что цитаты, you’d лучше знают [приблизительно 112].

0
ответ дан 11 November 2019 в 09:32

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

Похожие вопросы: