我无法删除文件:
sudo rm /usr/local/bin/Katy Perry - Dark Horse (Official) ft. Juicy J-0KSOMA3QBU0.mp4.part
显示错误:
bash: syntax error near unexpected token `('
如何修复?
答案1
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 的回答),并且会自动执行此操作,以便您不会错过任何内容。
实际上,我们在命令行上进行的大量引用实际上是通过制表符补全自动实现的。
还请注意,制表符补全不仅限于必须用引号引起来的情况。例如,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'
'
(我把上面命令中引用的部分用斜体标出,以便能够看到其效果。)
当使用 引用时'
,只有'
会被特殊处理。它始终作为结束引号匹配。
相比之下,使用双引号引用(正如广泛推荐的那样)(即使在没有必要的情况下)通常会起作用,但要按照相当复杂的规则进行操作。
手动引用"
有三种常见情况引用"
优先于使用'
。
出于某些原因,许多人在风格上更喜欢
"
。这并不一定是错误的或不可取的,但我建议不要使用 ,"
除非你熟悉并熟悉它会阻止和不会阻止的 shell 扩展的规则。当表达式包含单引号字符 (
'
) 时,不能将其括在单引号中,但可以将其括在双引号中。与 一样'
,"
引用会删除空格、制表符、换行符(换行符)、(
和)
、{
和}
、和 、<
和>
、;
和 、&
和|
、?
和*
、~
和 的特殊含义#
。(可能还有其他字符,取决于我是否忘记了什么以及启用了哪些 shell 选项。)例如:du -h "Don't Ask Me Why (Eurythmics, 1989).flac"
因此,双引号对于您要删除的特定文件(其名称包含特殊字符、和空格)非常有用
(
,)
并且建议使用它们在这种情况下很有帮助,非常好。但是,与 不同
'
,用 引用不会删除、、和"
的特殊含义(除非禁用历史记录扩展)。 (也不会删除,正如您所期望的那样,它会被解释为结束双引号。$
`
\
!
"
通常。)"
因此,引用很有用,当你不想要阻止 shell 根据这些字符的含义执行扩展。例如,运行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.
当未加引号的
\
字符位于不需要进一步加引号的字符之前时,它将保持不变。(因此,\\
在上面的命令中,可能只有一个\
.)在双引号内,
\
before!
会删除其特殊含义(即阻止历史扩展)。但与\
引用其他特殊字符不同,\
before!
不会被删除。因此,\!
被解释为文字\!
,而\$
被解释为文字$
,\
before 空格被解释为文字空格。
手动引用\
\
引用单个字符,以及紧随其后的字符。(当然,引用单个字符本身的情况除外。)
对于大多数角色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
空间在终端中是不允许的,因为它们分隔了命令的不同部分。因此,对于带有空格的文件名,您必须使用引号,如@Cornelius 所说,或者\
在每个空格之前:
sudo rm /usr/local/bin/Katy\ Perry\ -\ Dark\ Horse\ \(Official\)\ ft.\ Juicy\ J-0KSOMA3QBU0.mp4.part
由于一些罕见的命令不接受引号,您最好了解\
。