为什么当我们执行 ls -a 时 . 和 .. 会作为隐藏文件输出?

为什么当我们执行 ls -a 时 . 和 .. 会作为隐藏文件输出?

它们是否被默认添加到每个为方便外部移动而创建的目录中?

答案1

前导点文件名

简单的答案是因为这些文件名以点开头。任何以点开头的文件名都被视为Linux 上的隐藏文件(即使在这种情况下文件名本身只有一个字符长)并且基本上是可以追溯到第一个 Unix OS 的“传统”。您可以使用 查看它们ls -a

如果你想知道为什么在代码级别上它在 coreutils 包中ls.c的文件中被设置为默认src/ls.c

638 static enum
639 {
640   /* Ignore files whose names start with '.', and files specified by
641      --hide and --ignore.  */
642   IGNORE_DEFAULT,
643 
644   /* Ignore '.', '..', and files specified by --ignore.  */
645   IGNORE_DOT_AND_DOTDOT,
646 
647   /* Ignore only files specified by --ignore.  */
648   IGNORE_MINIMAL
649 } ignore_mode;

简单的应用

你问:

它们是否被默认添加到每个为方便外部移动而创建的目录中?

是的,因为.指的是目录本身,..指的是父目录。例外情况是/作为文件系统树的根目录。在这种情况下,..指的是/自身,因为没有比它更高的目录。不用记住每个路径,方便之处在于您可以使用 向上一级cd ..。很简单,对吧?现在想象一下你有一个很长的路径。输入父目录的完整路径很不方便,而 则..简单得多。它还允许简单的脚本,例如我通过 保留的这个函数.bashrc

goup() {
    num=$1 
    while [ $num -ne 0 ] 
    do
        cd .. 
        num=$(expr $num - 1 ) 
    done 
} 

通过指定goup 5i,可以向上转到 5 个目录,其中每个目录..都引用父目录的父目录的父目录。

如果.有必要的话,它可以被脚本用来判断它们当前的位置。

在其他语言中,实用程序

Shell 显然值得关注。它们的行为与 相同ls,默认情况下,当使用 glob 时会忽略文件名

$ echo *
LICENSE README.md ayatana-indicator ayatana-indicator.desktop debian
star:

如果我们添加包含隐藏文件,我们就可以模仿ls -ashell glob 。.*

$ echo * .*
LICENSE README.md debian indicator-bulletin indicator-bulletin.desktop .git .gitignore

相比之下,其他一些程序/实用程序和编程语言不会隐藏这些项目(或至少不会隐藏.)。然而,它们的用途远不止列出目录,它们更适合解析文件(请阅读为什么不应该解析 ls(1) 的输出)。

$ find -maxdepth 1 
.
./.git
./README.md
./LICENSE
./debian
./indicator-bulletin.desktop
./.gitignore
./indicator-bulletin

$ perl -le 'opendir(dh,$ARGV[0]);while( $file = readdir(dh) ){ print $file; }; closedir(dh);' "."                 
.git
..
README.md
LICENSE
debian
.
indicator-bulletin.desktop
.gitignore
indicator-bulletin

Pythonos.listdir()有一个显著的例外 - 它不显示.也不显示..glob模块可用于显示与 shell 中相同的行为。

$ python -c 'import os;print(os.listdir("."))'                                                                    
['.git', 'README.md', 'LICENSE', 'debian', 'indicator-bulletin.desktop', '.gitignore', 'indicator-bulletin']

$ python -c 'import glob;print(glob.glob(".*"),glob.glob("*"))'                                                   
(['.git', '.gitignore'], ['README.md', 'LICENSE', 'debian', 'indicator-bulletin.desktop', 'indicator-bulletin'])

答案2

在 MS-DOS 和 Windows 中也有...。很简单,.代表当前目录,..代表父目录。

MS-DOS 诞生于 CPM 操作系统,当时比尔盖茨以 80,000 美元的价格购买了版权并将其授权给 IBM 作为 PC-DOS,后来演变为 MS-DOS,再演变为 Windows,据预测,Windows 最终将为比尔盖茨带来一万亿美元的收入。

Linux 也使用.并且..作为第一个文件系统版本基于 IBM PC-AT 硬件。

正如 Serg 在 Linux 中回答的那样...不会出现在ls命令中,因为任何以 开头的文件.都是隐藏文件。ll不过,您可以使用别名来查看这些文件。

在 MS-DOS 和 Linux 中,您都可以使用cd ..命令更改到父目录。在 Linux 中,当您想要调用当前目录(而不是路径)中的命令时,您需要在命令前加上前缀./。但是在 MS-DOS 中,它会在搜索 PATH 之前自动在当前目录中查找命令。

Apple Mac 和 Google Android 基于 Linux 操作系统,但我不知道他们的文件系统是否也使用...

答案3

以 开头的文件.是隐藏文件。隐藏部分是为了方便用户提供他们可能想要看到的更清晰的输出。

在正常情况下,用户正在寻找他将要使用的文件的输出,例如文字处理器文件、图片和系统上的其他数据。

-a选项是显示的参数全部文件。其中包括隐藏文件。

隐藏文件通常是一些特殊文件,例如配置和辅助文件。您可以通过包含来查看它们全部文件,或输出中的文件。GUI 文件浏览器具有显示隐藏文件选项。

在这种情况下,文件是...。它们是您的目录的规范。单点是您的当前目录。双点是父目录。您可以通过键入以下内容从您所在的位置备份到父目录:

$  cd ..

就像其他以点开头的文件一样,它们是隐藏的。一个人将指定显示所有如果他们想查看这些目录规范,则显示隐藏文件。

相关内容