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

6
一个打印当前目录下文件和文件夹及它们的总大小的命令是du -sh *。然而,该命令并不会列出隐藏的文件或文件夹。我找到了一个解决方案,可以正确地列出所有隐藏的文件和文件夹:du -sh .[!.]* *。虽然它完美地工作,但是该解决方案是原样提供的,没有任何解释。
那么,.[!.]*的含义是什么?它是如何工作的?
3个回答

3

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

[!.] - 匹配除了 . 以外的任何字符,参考文献

* - 任意数量的字符

因此,这个模式表示匹配以 . 开头但不是 .. 的文件。


3
这是一个通配符模式,基本上告诉bash查找所有以 . 开头的文件,后面跟着任何字符但不包括 . ,然后再包含任何字符。有关bash通配符模式的详细解释,请参见此页面

1
所以它匹配所有以 . 为前缀的文件/文件夹,同时隐式排除路径 ...。非常聪明! - sig_seg_v
1
是的,我也这么认为 :) 这是一个不错的技巧。你能告诉我在哪个页面找到它吗?可能还有其他值得学习的东西... 我真的建议阅读我指出的那个页面。写这篇文章的人很懂他的bash。 - tgo
1
这是从这里大约十五个评论:http://www.ducea.com/2006/05/14/tip-how-to-sort-folders-by-size-with-one-command-line-in-linux/ - sig_seg_v
请注意,现在我们可以使用 du -sh (...) | sort -hr,而不必使用 du -s (...) | sort -nr,因为 sort -h 按人类可读的字节计数进行排序。我不确定当时的对话中是否存在该标志约十年前。 - sig_seg_v

0

.[!.]* 的意思是以 . 开头但不跟随.,因此它将包括当前目录下的所有隐藏文件和目录,但排除父目录。

因为这种行为是由 shell glob 模式决定的。因此您可以使用 ls .[!.]* 查看实际在您的 shell 环境中获取了什么。

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

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

来自Bash手册

dotglob 如果设置,bash会在路径名扩展的结果中包含以“.”开头的文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接