为什么“ls .*”显示隐藏目录的内容?

为什么“ls .*”显示隐藏目录的内容?

为什么ls .*打印出隐藏目录的内容?我只想打印隐藏文件,现在看到了 仅显示隐藏文件是一个解决方案,但我仍然想了解为什么显示目录的内容。进一步嵌套目录的内容不会显示。

ls .*以下是我的主目录中的部分输出。

.bash_history
.bash_profile
.bashrc
.coin_history
.emacs
.gitconfig
.gitignore_global
.grasp_jss

.ssh:
config          github_rsa.pub  id_rsa.pub      known_hosts.old
github_rsa      id_rsa          known_hosts     lambda.pem

.vim:
colors   ftdetect syntax

这台机器正在运行 RHEL。在 Mac OSX 上观察到类似的行为。

答案1

简短的回答:shell 全局扩展。

shell 接受您的输入并.*在将其传递给 之前展开该部分ls,因此您实际上正在执行以下操作:

$ ls .bash_history .bash_profile .bashrc .coin_history .emacs ...

所以它列出了每个条目。当它看到目录条目时,它会列出该目录的内容,就像您期望ls的那样。要仅查看工作目录中的文件/目录,请使用-d以下选项ls

$ ls -d .*

-d选项告诉ls“列出目录本身,而不是它们的内容”(取自ls手册页)。

答案2

为什么ls .*打印出隐藏目录的内容?

ls给定一个目录时,它会打印该目录的内容(默认情况下,不包括该目录中的隐藏文件)。通过ls .*,shell 给出了ls以 开头的文件和目录列表.

您可以使用set -x来查看 shell 调用的命令(即,在扩展 shell glob 之后)。

答案3

当你这样做时

$ ls directory

您将获得 的列表directory。如果directory是目录,则将列出其内容,否则将与其他文件一样列出。

当你这样做时

$ ls dir*

您将得到所有匹配的内容的列表dir*。如果其中任何一个是目录,您将看到这些目录的内容。

当你这样做时

$ ls .*

您将获得与上一个示例相同的效果,只是模式不同,并且由于您显式匹配隐藏文件和文件夹,因此这些(匹配的文件和文件夹)将被 考虑ls

如果您不想查看文件夹的内容(隐藏或不隐藏),请使用ls其标志。-d它会停止ls递归到任何与您给定的模式匹配的找到的文件夹。

答案4

因为你具体地告诉它。如果 shell glob 扩展部分对您来说是显而易见的,我想您真正需要的答案是考虑到您的问题背后的困惑。

您将给 ls 提供的内容与 ls 给您提供的内容混淆了。虽然 ls 不会给你隐藏的目录/文件,但你可以给它列出隐藏的目录/文件。您是通过.*专门使用来完成的(重点是.not on *)。

相关内容