在 shell 脚本中,.[!.]* 是什么意思?

In shell scripting, what does .[!.]* mean?

打印当前目录中的文件和文件夹列表及其总大小的命令是 du -sh *。但是,仅该命令不会列出隐藏的文件或文件夹。我找到了一个命令的解决方案,该命令确实正确地列出了隐藏的文件和文件夹以及其他文件和文件夹:du -sh .[!.]* *。虽然它完美运行,但解决方案是按原样提供的,没有任何解释。

.[!.]*到底是什么意思?它是如何工作的?

. - 匹配一个.,隐藏文件的前缀

[!.] - 匹配任何字符,只要它不是 .see ref

* - 任意数量的字符

所以这个模式意味着匹配文件以 . 开头而不是 ..

这是一个 globbing 模式,基本上告诉 bash 查找所有以 . 开头的文件,后跟 . 以外的任何字符,然后包含任何字符。

有关 bash globbing 模式的详细解释,请参阅 this page

.[!.]*的意思是任何以.开头但后面不跟.的文件或目录,所以会包括当前目录下所有隐藏的文件和目录,但不包括父目录目录。

因为这种行为是由 shell glob 模式决定的。因此,您可以使用 ls .[!.]* 查看 shell 环境中实际得到的内容。

顺便说一句,您可以在 shell 中打开 dotglob 以简化 du 命令。

$ shopt -s dotglob
$ du -sh *
$ shopt -u dotglob

来自 bash 手册

dotglob If set, bash includes filenames beginning with a `.' in the results of pathname expansion.