pwd
是我的主目录。ls */ -d
显示目录。
~$ ls */ -d
Blog/ Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
并ls -a
显示所有隐藏的目录和文件。隐藏目录.cache
-.local
等
$ ls -a
. .cache .gnupg .xsession-errors.old
.. .config .gtkrc-2.0 Templates
.bash_history Desktop .gtkrc-xfce Pictures .themes
.bash_logout .linuxmint .pki Videos
.bashrc Documents .local .profile .viminfo
Blog Downloads .mozilla Public .Xauthority
Music .ssh .xsession-errors
但是当我运行时ls -ad */
,它不会显示任何隐藏目录。有人愿意解释一下吗?
$ ls -ad */
Blog/ Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
答案1
当您运行 时ls -a
,命令行上没有文件名ls
(如 所示ls
),因此它会自行确定应列出的文件名。由于-a
已指定,因此包括显示“隐藏”文件。
当您运行ls -d */
和时ls -ad */
,shell 会展开*/
,并提供将显示的文件名列表ls
。*
文件名模式开头不匹配.
,因此*/
不包括隐藏文件:与 结合使用-d
,-a
在这里没有效果。
要查看隐藏目录,您可以明确列出它们:ls -d -- */ .*/
。在某些 shell 中,您也可以要求*
匹配隐藏文件;例如在 Bash 中,使用shopt -s dotglob
(请注意,在这种情况下不包含.
和..
,这使其行为更像ls -A
)。
另请注意--
,您忘记标记选项的结尾,以确保文件名以 . 开头时不会被视为选项-
。另请注意,*/
包括目录和目录的符号链接。如果使用zsh
,您可以ls -d -- *(D/)
仅列出目录(包括带有 的隐藏目录),而不向每个文件D
添加尾随。/
或者,*(D-/)
如果您确实想要目录的符号链接。
答案2
*
故意地不匹配隐藏文件或目录,因为大多数时候这正是我们想要的(因为点文件和目录通常用于配置,而不是数据),并且您可以通过显式指定以.
if/开头的 glob 来覆盖默认值当你需要的时候。
如果您希望它们通过 glob 进行匹配,请使用ls -d .*
(或ls -d .*/
仅匹配没有常规文件的隐藏目录)。要匹配隐藏和非隐藏目录,请使用ls -d -- */ .*/
注意:正如 @rexkogitans 在评论中提到的,globs 就像*
由 shell 扩展前它们被传递给一个程序。 ls
永远不会看到*
or .*
(或.*/
),它看到的是 shell 扩展 glob 的结果的文件和/或目录名称列表。这就是为什么如果要将全局字符作为字符串文字传递给程序,则需要引用或转义(通过使用反斜杠作为前缀)全局字符。
另请注意:如果没有与 glob 匹配的文件/目录,则 glob 将按原样传递给程序,未展开(即将ls
视为*
其参数)。 bash
(以及其他一些类似 bourne 的 shell)允许覆盖此行为 - 例如,在 bash 中,您可以使用nullglob
或failglob
shell 选项。 nullglob 导致它被扩展为空(即从参数列表中删除),而failglob 会触发错误。
答案3
简短的答案似乎在任何地方都没有很好地拼写出来,那就是,当您使用 时, in ls
, -a
/ -A
会被忽略 -d
,因为-a
/ 控制显示(列出)目录内容的 -A
方式,并告诉它ls
-d
不是列出目录的内容。