在shell命令中。?? *是什么意思?


Answers:


32

不是正则表达式。通常,shell会尝试解释您在命令行中键入的任何内容(如果您没有将其引为全局名称)。完全不需要外壳程序支持正则表达式(尽管实际上,许多更现代的外壳程序都支持正则表达式,例如=~bash [[构造中的regex匹配运算符)。

.??*是一个问题。它匹配任何以文字点开头的文件名.,后跟任意两个(不一定相同)字符??,然后是等价的正则表达式[^/]*,即0或多个not /

有关shell路径名扩展的完整详细信息(“ globbing”的全名),请参见POSIX规范


10
另外一点:这是一种尝试编写一个glob的尝试,该glob与目录中特殊条目.之外的所有点文件都匹配..,通常情况下,它们不希望做任何事情。这不太正确;它不会选择任何名为' .X的内容,其中X是点以外的其他字符。我认为不可能编写一个与所有点文件相匹配的glob (.和和除外)..,但是您可以用两个来实现:tar zcvf dotfiles.tar.gz .[!.] .??*例如。
zwol 2012年

@Zack:感谢您的澄清。我对此发表了评论,但随后将其删除。ls .?返回与相同的结果ls ..,这意味着文件夹中没有其他与模式匹配的条目.?。除了。以外,我将对.[^.]所有.?其他文件进行处理..
SabreWolfy 2012年

2
@SabreWolfy如果您仔细阅读POSIX规范,则实际上是glob 和regex之间的重要区别:在括号表达式中,[^abc]regex语法的含义与[!abc]glob语法相同(即,用glob ^替换!)。[^abc]在glob中使用样式语法不是很容易移植,因为POSIX没有指定含义,因此某些shell使用类似于regex的语义来解释它,而另一些shell则^仅将其视为文字字符。
jw013

1
@ jw013:感谢您提供详细信息。我必须记得那个glob!= regexp :)
SabreWolfy 2012年

1
在我看来,在没有匹配该模式的文件的常见情况下,.[!.]可能会将其保留为tar命令行上的文字。一些外壳程序使您可以控制该行为(例如使用bash),shopt -s nullglob如果该行为与任何内容都不匹配,则该行为将从命令行消失,但这不是通用功能。
zwol 2012年

8

.??*通配符(正则表达式,虽然它看起来是这样)转化为以周期(开始的文件名.),接着两个单字符(??),然后其他字符的任何数量(零个或多个)( *)。

也许“ 文件名中的通配符”这一页会有所帮助。


-1

为了增加其他答案,单个?将转换为单个字符文件名,??并将匹配仅包含两个字符的文件名,依此类推。

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#

唐纳德·沃特,你能发表评论吗?如果我错了,很高兴得到纠正。
SREE

您的答案没有完全回答问题。
SabreWolfy '16
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.