Woo*_*ock 1 command-line zsh wildcards
我想将文件夹dotfiles
中的所有内容复制~
到 git 存储库来备份它们,并且我正在使用ZSH
.
我发现这个命令似乎有效:
cp -a ~/.[^.]* .
决赛在哪里。是 git 目录。
我不明白这是如何运作的。谁能给我一个指南,或者告诉我通过谷歌搜索什么来了解更多信息?
我试过ZSH
+
[^]
+
globbing
该语法适用于除此之外的某些shell zsh
,即使在那里,它也会是错误的。
.[^.]*
匹配以 开头、后跟 0 或多个字符.
以外的字符的文件名。.
这就是您在包含.
和 的..
扩展的shell 中需要的语法.*
。
.
和..
是分别用于引用当前目录和父目录的导航工具。它们在 glob 扩展中没有位置,因为 glob 是生成实际文件\xc2\xb9 列表的工具。尽管如此,历史上 shell 一直将它们包含在其全局扩展中,正如 所报道的那样readdir()
。
zsh
,如 Forsyth shell 及其后代(pdksh、mksh、OpenBSD sh...)或fish
shell 已修复该问题,并且永远不会在文件名生成\xc2\xb2的结果中包含.
Nor ,即使在像这样的 glob 中:..
$ echo (.|..)\nzsh: no matches found: (.|..)\n
Run Code Online (Sandbox Code Playgroud)\n在一般情况下它也是错误的,因为它会丢失像..foobar
.
另请注意[^.]
,虽然许多 shell 支持,但它不是标准 POSIX 语法。
在 POSIXsh
语法中,您需要:
cp -a ~/.[!.]* ~/..?* .\n
Run Code Online (Sandbox Code Playgroud)\n(我们在其中添加..?*
匹配项,..
后跟一个或多个字符,以涵盖..foobar
上述文件名的类型)。
在zsh
(以及上面提到的其他 shell)中,您只需要:
cp -a ~/.* .\n
Run Code Online (Sandbox Code Playgroud)\n希望POSIX 最终会允许/推荐 sh,并且我们会看到更多其他 shell 效仿。
\n\xc2\xb9 根据历史记录,根据传说,名称以隐藏开头的文件的概念起源.
于70ls
年代该实用程序早期版本中的一个错误,最终导致所有以隐藏开头的文件名.
被隐藏目的只是为了隐藏.
和..
。当人们开始依赖它来隐藏文件时,这个错误就成为了一个功能
\xc2\xb2 Bashglobskipdots
在 5.2 版本中添加了一个选项。