终端命令中的问号是什么意思?


Answers:


15

这些称为通配符(通配符模式)

各种命令行实用程序都使用标准通配符(也称为通配符模式)来处理多个文件。
几乎所有命令(包括mv,cp,rm和许多其他命令)都使用标准通配符。

  • (question mark)

    这可以代表任何单个字符。如果您在命令行中指定了诸如“ hd?”之类的内容 GNU / Linux将查找hda,hdb,hdc以及az(0-9)之间的其他每个字母/数字。

  • *(asterisk)

    它可以代表任意数量的字符(包括零个字符,换句话说,零个或多个字符)。如果指定了“ cd *”,它将使用“ cda”,“ cdrom”,“ cdrecord”以及以“ cd”开头的任何内容,还包括“ cd”本身。“ m * l”可以用磨,仔细考虑,ml以及任何以m开头并以l结尾的东西表示。

  • [ ] (square brackets)

    指定范围。如果您做了m [a,o,u] m,它可能会变成:妈妈,妈妈,妈妈如果您做了:m [ad] m,它可能会变成任何以m开头和结尾,并且中间有a到d的字符。例如,这些将起作用:mam,mbm,mcm,mdm。这种通配符指定“或”关系(您只需要一个即可匹配)。

  • { } (curly brackets)

    术语用逗号分隔,每个术语必须是名称或通配符。该通配符将复制与通配符或确切名称(“或”关系,一个或另一个)匹配的任何内容。


例如,这将是有效的:

  • cp { .doc, .pdf}〜

    这会将以.doc或.pdf结尾的所有内容复制到用户的主目录。请注意,逗号(或其他任何地方)后不能有空格。

  • [!]

    此结构类似于[]构造,除了不匹配方括号内的任何字符,只要不在[和]之间列出,它将匹配任何字符。这是合乎逻辑的NOT。例如,rm myfile [!9]将删除所有myfiles *(即myfiles1,myfiles2等),但不会删除名称中任何地方带有数字9的文件。

  • \ (backslash)

    用作“转义”字符,即保护后续的特殊字符。因此,“ \”搜索反斜杠。注意,您可能需要使用引号和反斜杠。

有关更多示例:请访问此页面


3
值得一提的是,它apt-get remove需要软件包名称,而不是文件名,这使得shell扩展通配符变得毫无用处。如果要删除一系列软件包,则需要使用完整的正则表达式,并用适当的引号引起来,以防止shell尝试将其解释为glob(例如apt-get remove 'gnome.*')。

4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=>错误。这些通配符由shell扩展,命令接收的是扩展的结果(即与模式匹配的文件)而不是模式。(如果没有与该模式匹配的文件,则该模式将直接传递给命令)
CarlosCampderrós2014年

17

一般而言,在Bash中,a ?是扩展为任意字符的glob模式。

例如:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2

它类似于*,但是a *扩展为0个或更多字符,而a ?扩展为正好一个(任意)字符。

不过,在您的特殊情况下,?命令中的显然是一个错字。


所以对我来说这是没用/不需要的,对吧?
Ooker 2014年

是。实际上,它是根据您提出问题时链接到的答案进行编辑的。:)
Malte Skoruppa 2014年

1
不敢相信:-o
Ooker 2014年

1
即使它们是正确的通配符,也应避免使用这种情况而无需引用。apt-get 可以理解RE,但是如果gnome1当前目录中存在一个名为的文件,则在apt-get有机会看到它之前,shell会将其展开。
Rmano

@Ooker你永远不会忘记它!
同志
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.