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

Sab*_*lfy 22 tar wildcards

下面的命令将tar所有的“点”文件和文件夹:

tar -zcvf dotfiles.tar.gz .??*
Run Code Online (Sandbox Code Playgroud)

我熟悉正则表达式,但我不明白如何解释.??*. 我执行ls .??*tree .??*查看了列出的文件。为什么此正则表达式包含文件夹中以.例如开头的所有文件?

jw0*_*013 32

Glob不是正则表达式。通常,shell 会尝试解释您在命令行中输入的任何未引用为 glob 的内容。Shell 根本不需要支持正则表达式(尽管实际上许多更高级的更现代的都支持,例如构造中的=~正则表达式匹配运算符bash [[)。

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

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

  • 附加点:这是尝试编写一个匹配目录中所有点文件的 glob,*除了*特殊条目 `.` 和 `..`,人们通常不想对它们做任何事情。这不太对;它不会选择任何名为 '`.X`' 的东西,其中 X 是点以外的某个字符。我认为不可能编写一个匹配*每个* dotfile 的单个glob,除了`.` 和`..`,但你可以用两个来实现:`tar zcvf dotfiles.tar.gz .[!.] 。 ??*` 例如。 (10认同)
  • @SabreWolfy 如果您仔细阅读 POSIX 规范,这实际上是 globs 和 regex 之间的一个重要区别:在括号表达式中,regex 语法中的 `[^abc]` 与 glob 语法中的 `[!abc]` 含义相同(即 `^ ` 替换为 `!` 表示 globs)。在 glob 中使用 `[^abc]` 样式语法不是很容易移植,因为 POSIX 没有指定它的含义,所以一些 shell 使用类似正则表达式的语义来解释它,而其他人将 `^` 视为一个文字字符。 (2认同)

Lev*_*von 9

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

也许这个关于文件名中通配符的页面会有所帮助。