ZSH Globbing 语法解释

Woo*_*ock 1 command-line zsh wildcards

我想将文件夹dotfiles中的所有内容复制~到 git 存储库来备份它们,并且我正在使用ZSH.

我发现这个命令似乎有效:

cp -a ~/.[^.]* .决赛在哪里。是 git 目录。

我不明白这是如何运作的。谁能给我一个指南,或者告诉我通过谷歌搜索什么来了解更多信息?

我试过ZSH + [^] + globbing

Sté*_*las 5

该语法适用于除此之外的某些shell zsh,即使在那里,它也会是错误的。

\n

.[^.]*匹配以 开头、后跟 0 或多个字符.以外的字符的文件名。.

\n

这就是您在包含.和 的..扩展的shell 中需要的语法.*

\n

...是分别用于引用当前目录和父目录的导航工具。它们在 glob 扩展中没有位置,因为 glob 是生成实际文件\xc2\xb9 列表的工具。尽管如此,历史上 shell 一直将它们包含在其全局扩展中,正如 所报道的那样readdir()

\n

zsh,如 Forsyth shell 及其后代(pdksh、mksh、OpenBSD sh...)或fishshell 已修复该问题,并且永远不会在文件名生成\xc2\xb2的结果中包含.Nor ,即使在像这样的 glob 中:..

\n
$ echo (.|..)\nzsh: no matches found: (.|..)\n
Run Code Online (Sandbox Code Playgroud)\n

在一般情况下它也是错误的,因为它会丢失像..foobar.

\n

另请注意[^.],虽然许多 shell 支持,但它不是标准 POSIX 语法。

\n

在 POSIXsh语法中,您需要:

\n
cp -a ~/.[!.]* ~/..?* .\n
Run Code Online (Sandbox Code Playgroud)\n

(我们在其中添加..?*匹配项,..后跟一个或多个字符,以涵盖..foobar上述文件名的类型)。

\n

zsh(以及上面提到的其他 shell)中,您只需要:

\n
cp -a ~/.* .\n
Run Code Online (Sandbox Code Playgroud)\n

希望POSIX 最终会允许/推荐 sh,并且我们会看到更多其他 shell 效仿。

\n
\n

\xc2\xb9 根据历史记录,根据传说,名称以隐藏开头的文件的概念起源.70ls年代该实用程序早期版本中的一个错误,最终导致所有以隐藏开头的文件名.被隐藏目的只是为了隐藏...。当人们开始依赖它来隐藏文件时,这个错误就成为了一个功能

\n

\xc2\xb2 Bashglobskipdots在 5.2 版本中添加了一个选项。

\n