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]#