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

Nay*_*yed 4 linux command-line ls command

pwd是我的主目录。ls */ -d显示目录。

~$ ls */ -d
Blog/  Desktop/  Documents/  Downloads/  Music/  Pictures/  Public/  Templates/  Videos/
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是当我运行时ls -ad */,它不会显示任何隐藏目录。有人愿意解释吗?

$ ls -ad */ 
Blog/  Desktop/  Documents/  Downloads/  Music/  Pictures/  Public/  Templates/  Videos/
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 15

当您运行 时ls -als命令行上没有文件名(如 所见ls),因此它会自行确定应列出的文件名。由于-a已指定,这包括显示“隐藏”文件。

当您运行ls -d */and 时ls -ad */,shell 会展开*/,并提供ls将显示的文件名列表。*在文件名模式的开头不匹配.,因此*/不包含隐藏文件:与 结合使用-d-a此处无效。

要查看隐藏目录,您可以明确列出它们:ls -d -- */ .*/. 在某些 shell 中,您也可以要求*匹配隐藏文件;例如在 Bash 中, with shopt -s dotglob(注意...不包括在这种情况下,这使得它的行为更像ls -A)。

另请注意--,您忘记标记选项的结尾以确保文件名以-. 另请注意,*/包括目录和指向目录的符号链接。如果使用zsh,您可以ls -d -- *(D/)只列出目录(包括带有 的隐藏目录D),而无需/为每个文件添加尾随。或者,*(D-/)如果您确实想要目录的符号链接。


cas*_*cas 14

* 故意不匹配隐藏文件或目录,因为大多数时候这正是我们想要的(因为点文件和目录通常用于配置,而不是数据),并且您可以通过显式指定以.if开头的 glob 来覆盖默认值/当你需要的时候。

如果您希望它们与 glob 匹配,请使用ls -d .*(或ls -d .*/仅匹配没有常规文件的隐藏目录)。要匹配隐藏和非隐藏目录,请使用ls -d -- */ .*/

注意:正如@rexkogitans 在评论中提到的,在传递给程序之前*,shell 会扩展类似的 glob 。 永远不会看到 a or (or ),它会看到作为 shell 扩展 glob 的结果的文件和/或目录名称列表。这就是为什么如果要将全局字符作为字符串文字传递给程序,则需要引用或转义(通过以反斜杠作为前缀)全局字符。ls*.*.*/

另请注意:如果没有与 glob 匹配的文件/目录,则 glob 将按原样传递给程序,未扩展(ls即将*视为其参数)。 bash(以及其他一些类似 bourne 的 shell)允许覆盖此行为 - 例如,在 bash 中,您可以使用nullglobfailglobshell 选项。nullglob 导致它被扩展为空(即它从参数列表中删除),而 failglob 触发一个错误。

  • 我想应该指出的是,`*/` 在命令调用之前被 shell globbing 替换。因为你有 9 个未隐藏的目录,它被 9 个分别传递给 `ls` 的参数替换。这种行为与 DOS 和 Windows 不同,其中参数 `*/` 是按字面传递给命令的(例如 `dir`),并且命令需要执行 globbing。 (5认同)