ls -ad */ 不会显示隐藏目录

ls -ad */ 不会显示隐藏目录

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 中,您可以使用nullglobfailglobshell 选项。 nullglob 导致它被扩展为空(即从参数列表中删除),而failglob 会触发错误。

答案3

简短的答案似乎在任何地方都没有很好地拼写出来,那就是,当您使用 时, in  ls,  -a / -A会被忽略 -d,因为-a / 控制显示(列出)目录内容的 -A方式,并告诉它ls-d不是列出目录的内容。

相关内容