Answers:
球不是正则表达式。通常,shell会尝试解释您在命令行中键入的任何内容(如果您没有将其引为全局名称)。完全不需要外壳程序支持正则表达式(尽管实际上,许多更现代的外壳程序都支持正则表达式,例如=~,bash [[构造中的regex匹配运算符)。
这.??*是一个问题。它匹配任何以文字点开头的文件名.,后跟任意两个(不一定相同)字符??,然后是等价的正则表达式[^/]*,即0或多个not /。
有关shell路径名扩展的完整详细信息(“ globbing”的全名),请参见POSIX规范。
.和之外的所有点文件都匹配..,通常情况下,它们不希望做任何事情。这不太正确;它不会选择任何名为' .X的内容,其中X是点以外的其他字符。我认为不可能编写一个与所有点文件相匹配的glob (.和和除外)..,但是您可以用两个来实现:tar zcvf dotfiles.tar.gz .[!.] .??*例如。
ls .?返回与相同的结果ls ..,这意味着文件夹中没有其他与模式匹配的条目.?。除了。以外,我将对.[^.]所有.?其他文件进行处理..。
[^abc]regex语法的含义与[!abc]glob语法相同(即,用glob ^替换!)。[^abc]在glob中使用样式语法不是很容易移植,因为POSIX没有指定含义,因此某些shell使用类似于regex的语义来解释它,而另一些shell则^仅将其视为文字字符。
.[!.]可能会将其保留为tar命令行上的文字。一些外壳程序使您可以控制该行为(例如使用bash),shopt -s nullglob如果该行为与任何内容都不匹配,则该行为将从命令行消失,但这不是通用功能。
为了增加其他答案,单个?将转换为单个字符文件名,??并将匹配仅包含两个字符的文件名,依此类推。
[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]#