【问题标题】:why does command line rm not accept quotation marks for directories with spaces?为什么命令行 rm 不接受带有空格的目录的引号?
【发布时间】:2024-08-29 21:50:01
【问题描述】:

由于空格和括号,在 Debian 的命令行中运行 rm projects/artwork/My Project (543893)/Images/*.png 不起作用。我需要逃离他们。但我认为引号 "" 是转义的替代方法。它适用于其他命令,例如cd,但不适用于rm。这是为什么呢?

【问题讨论】:

  • 请参阅下面有关主要问题的答案,即需要确保* 在引号之外。关于cdrm 的问题,我怀疑您没有将like 与like 进行比较,因为您的cd 命令不太可能包含*

标签: linux quoting rm


【解决方案1】:

您应该确保:

  • 空格和括号在引号内,因此它们被视为文字,否则这些字符将对shell具有特殊含义(用于分隔命令行参数的空格, 以及子shell命令的括号)

  • 1234563 @。

请记住,您不需要将引号应用于整个字符串,只需将需要视为文字的部分应用到外壳上,否则将被 shell 赋予特殊含义。

例如,您可以使用:

rm projects/artwork/"My Project (543893)"/Images/*.png

同样,如果您使用转义,请转义空格和括号,但不要转义通配符:

rm projects/artwork/My\ Project\ \(543893\)/Images/*.png

(换句话说,你不会使用\*。)

【讨论】:

    【解决方案2】:

    因为 globbing 不适用于引用:

    $ ll /tmp/"d i r"/*.png
    -rw-r--r--. 1 postgres postgres 0 May 26 14:02 /tmp/d i r/a.png
    -rw-r--r--. 1 postgres postgres 0 May 26 14:02 /tmp/d i r/p.png
    $ ll "/tmp/d i r/*.png"
    ls: cannot access /tmp/d i r/*.png: No such file or directory
    $ rm "/tmp/d i r/*.png"
    rm: cannot remove ‘/tmp/d i r/*.png’: No such file or directory
    $ rm /tmp/"d i r"/*.png
    $ ll /tmp/"d i r"/*.png
    ls: cannot access /tmp/d i r/*.png: No such file or directory
    

    【讨论】:

    • 我不认为“globbing 不适用于引用”是一个准确的陈述,这个答案是一个很好的例子,说明了如何使 glob 与引用一起工作。也许更准确地说双引号将 * 抑制为 glob 元字符(或其他措辞)。
    • 别名,无论多么常见,都不是通用的,ll 也很难标准化。 ll 不应在答案中使用。