问题
A command that prints a list of files and folders in the current directory along with their total sizes is du -sh *. That command alone doesn't, however, list hidden files or folders. I found a solution for a command that does correctly list the hidden files and folders along with the rest: du -sh .[!.]* *. Although it works perfectly, the solution was provided as-is, without any explanation.
What is the meaning of .[!.]*, exactly? How does it work?
回答1:
It's a globbing pattern that basically tells bash to find all files starting with a ., followed by any character but a .and containing any character after that.
See this page for a great explanation of bash globbing patterns.
回答2:
. - match a ., prefix of hidden file
[!.] - match any character, as long as it is not a ., see ref
* - any number of characters
so this pattern means match files starts with . but not ..
回答3:
.[!.]* the meaning is any file or directory name start with . but not following with ., so it will include all hidden files and directories under current directory but exclude parent directory.
Because this behaviour is decided by shell glob pattern. So you can use ls .[!.]* to see what actually get in your shell environment.
BTW, you can turn dotglob on in your shell to simplify your du command.
$ shopt -s dotglob
$ du -sh *
$ shopt -u dotglob
From bash manual
dotglob If set, bash includes filenames beginning with a `.' in the results of pathname expansion.
来源:https://stackoverflow.com/questions/41034115/in-shell-scripting-what-does-mean