博客大纲
目录
现实中,为了将某一类文件放在一起,我们会用一个文件夹,然后将对应的文件都放进去。
而在Linux操作系统中,也有类似的结构:目录。直观上来讲,目录就是一个可以存放文件的“文件夹”。
比如这样的结构:
abc ├── 1.txt ├── 2.txt ├── 3.txt ├── 4.txt └── 5.txt
在这里,abc就是一个目录,在abc目录中,存放了五个文件。
但是目录并不是真的把文件放在里面。目录是一个“特殊的文件”,它知道文件的存储位置。这就说明了为什么它被称为目录而不是文件夹。
在“文件夹”这样的结构中,我们将文件放在里面。而在“目录”这样的结构中,其内容其实只是一个索引。
比如一本书的目录,会向读者标识什么章节在第几页,这就是指明了这个章节的名称以及位置。
而Linux的目录也是一样的,它其实只向用户展示目录内部文件的信息,在访问目标文件时,将目标文件的位置交给操作系统。
根目录
我们在使用Linux时,若多次返回到上级目录,你会发现返回到一个名为/
的目录后,就无法再返回了。
/
是Linux的根目录,不论你从哪一个目录开始返回,最后都会到达根目录。就好像一只蚂蚁不论在哪一个树枝上,只要它想要返回地面,都会经过树的主干。
而根目录能与树联系起来,就是因为Linux中的文件与目录系统其实就是一个多叉树结构。
上图就是一个从根目录出发的树状图。
家目录
家目录也是一种特殊的目录,比如Linux,windows这样的多用户操作系统,都有家目录的概念。
顾名思义,多用户操作系统就是指可以有多用户使用的操作系统,而用户分为两种:超级管理员和普通用户。超级管理员有所有的计算机权限,而对于普通用户,只能使用部分功能。
那么用户使用操作系统,必然会产生一些文件,这些文件要是都存放在一起,那就分不清楚哪一个文件是谁的了。
于是就为每个用户分配了一个目录,这个目录就叫做家目录。
当一个用户打开操作系统,会默认处于其家目录中。
目录的理念就是,将某一类文件都放在一起统一管理,而家目录就是按照不同用户来分类而产生的目录。
对于超级管理员,默认的家目录为/root
对于普通用户,默认的家目录为/home/xxx 其中xxx是用户名
此处可以理解为,超级管理员一人一间屋子,而普通用户要一起挤在同一间屋子中。
这样区分了不同用户之后,操作系统就可以分清楚一个文件是哪一个用户的了。
比如说,在图形化操作系统中,有着桌面这一概念,比如windows操作系统。
在上图中我们可以发现,桌面的本质是一个文件夹,类似与Linux中的目录。而这个桌面文件夹是存放在用户名这个文件夹中的。
如果把它迁移到Linux中:
可以理解为,由于每个用户的桌面不同,就将不同用户的桌面存放在它们的家目录中,当一个用户打开桌面,操作系统就在这个用户的家目录中查找桌面,就能准确打开属于这个用户的桌面了。
目录中的隐藏文件
当我处在一个目录中,使用ls
指令来观察这个目录中的文件:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
但是其实我们得到的并不是目录中的所有文件,ls -a
指令可以观察到目录中的一些隐藏文件,比如:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -a . .. 123.txt 124.txt a abc a.out code.c .hide
可以发现,当前目录下就多出了三个文件.
, ..
以及.hide
。它们都有一个特点,就以一个点开头。在Linux中,以点开头的文件就是隐藏文件。我们也可以创建隐藏文件,只需要在创建文件的时候在文件名前加一个点就行了,比如:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# touch .test [root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c [root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -a . .. 123.txt 124.txt a abc a.out code.c .hide .test
我们在创建了一个.test
文件后,直接用ls
观察,并没有显示,只有使用-a
选项后这个文件才出现。
一开始的.hide
就是用户自己创建的隐藏文件。
那么.
和 ..
是什么?
.
和 ..
是所有目录中都存在的两个隐藏文件,包括根目录:
[root@iZf8zdrs09p97o9xxgii5hZ /]# ls -a . .autorelabel boot etc lib lost+found mnt proc run srv tmp var .. bin dev home lib64 media opt root sbin sys usr
当我们观察根目录的隐藏文件,也能看到这两个隐藏文件,那么它们有什么作用呢?
.
用于标识当前目录的位置
..
用于标识上级目录的位置
我们来证明一下:
[root@iZf8zdrs09p97o9xxgii5hZ csdn]# cd . [root@iZf8zdrs09p97o9xxgii5hZ csdn]# cd .. [root@iZf8zdrs09p97o9xxgii5hZ ~]#
当前我们处在root
的家目录的csdn
目录下,我们用cd指令跳转到.
,会发现我们仍处于当前目录。
当我们用cd指令跳转到..
,我们就跳转到了~
目录下,即root的家目录。
可以发现,.
跳转到了当前目录csdn,而..
跳转到了上级目录。
在目录中保留一个..
文件,是为了返回上级目录,这个好理解,但是为什么要保留.
文件呢?
其实当我们处在某个目录时,是无法直接访问这个目录里的内容的,需要通过.
先找到自己,才能继续访问当前目录的内容。
比如说,我们在csdn目录中有一个a.out
的可运行文件,只要将其运行,就会输出“Hello Linux”:
[root@iZf8zdrs09p97o9xxgii5hZ csdn]# ls a.out lsInstruction
我们尝试直接运行一下它:
[root@iZf8zdrs09p97o9xxgii5hZ csdn]# a.out -bash: a.out: command not found
我们处于csdn这个目录下,但是操作系统居然找不到这个目录里的文件。
此时就需要用.
来找到“自己”了:
[root@iZf8zdrs09p97o9xxgii5hZ csdn]# ./a.out Hello Linux
当我们利用.
,来向操作系统反馈当前目录的位置,我们才能正常访问到当前目录里的文件。
路径
用户在寻找文件或子目录时,所历经的线路叫路径。
每个文件的路径都具有唯一性,为什么?我们来推导一下:
对于一个父目录,它会有很多个子文件或子目录。但是对于一个子文件或目录,都只有一个父目录。比如test.c
文件就只有一个父目录csdn
。
这就是路径的唯一性的基础,我们尝试从a.out
文件逆推:
a.out
的唯一父目录是csdn
,而csdn
的唯一父目录是home
,home
的唯一父目录是/
。在这个过程中,每个文件的父目录都是唯一的,所以这个路径也就是唯一的。
在路径具有唯一性的前提下,操作系统就可以根据不同的路径访问到不同的文件。
路径分为绝对路径和相对路径。我们一一介绍:
相对路径:
相对路径,就是指两个文件的相对位置。
假设我们有左侧的这样一个目录结构:
注意:~
就是root的家目录,使用的时候不能用~
,而应该使用root
。
现在我们处在csdn2
这个目录中,要怎样访问到a.out
文件?
此时如果使用相对路径,就是通过目录之间的相对位置来找到目标文件:
首先用.
来表示从当前目录出发,再使用..
跳回到上级目录~
,然后在上级目录~
中访问csdn
目录,最后在csdn
目录中访问a.out
文件。路径示意图就是右侧图片。
最后得到的相对路径就是:./../csdn/a.out
。由于我们当前就处于csdn2
,这里的./
也可以省略得到:../csdn/a.out
。
相对路径中..
使用极为广泛,因为..
标识的是上级目录,一旦目标文件不再当前目录下,就需要用到..
。
绝对路径:
绝对路径就是从根目录出发的路径,它直接以/
开头,表示当前就是从根目录开始的绝对路径。
比如我们任然处于csdn2
这个目录中,要怎样用绝对路径访问到a.out
文件?
由于绝对路径和处于哪一个目录无关,其实此时不论处在哪一个目录,访问a.out
文件的绝对路径都是一样的:
/
从根目录出发,跳转到~
目录,再跳转到csdn
目录,最后直接访问a.out
。
得到的绝对路径就是:/~/csdn/a.out
。
但是这样访问是有问题的无法访问到目标文件。~
就是root的家目录,使用的时候不能用~
,而应该使用root
。
所以我们的路径应该是:/root/csdn/a.out
。
博客制作不易,还请留下一个免费的赞!
有问题欢迎指出,博主非常喜欢讨论问题!