一、一切皆文件
在Linux的设计思想中,很重要的一点,就是“一切皆文件”。外设(键盘、鼠标、屏幕)、磁盘、打印机、甚至,都是文件。这是一种基于对计算机的理解,做出的很强的逻辑抽象。以下,我们会简单基于几种文件的分析,去理解和体会这种设计思路。
1.1 普通文件
首先来看普通文件,也就是数据文件。我们存放表格、文档、照片、视频等等的文件,是普通文件。普通文件里面,是用户的数据。它存放在硬盘上,具有自己的存放地址(起始扇区和结束扇区)。
![](https://img.haomeiwen.com/i10420503/94a76785d3edb1b7.png)
硬盘(磁盘)可以理解为具有一圈一圈磁道的圆盘,数据就是存储在这些磁道上的。数据肯定是有一定大小的,所以会有一个开始存放的位置和结束的位置。普通文件是比较容易理解的。
1.2 目录文件
上文中,我们说在Linux中,目录也是一个文件,叫目录文件
。听上去感觉有点奇葩,因为可能在更多人的心目中,目录更像是容器,去容纳和承载文件(普通文件)。但其实稍后做了解释,你可能就会觉得“目录理所当然是文件”。
首先我们来想一下目录的作用:构建一个“树形结构”,一层一层的去存放内容(其他目录、其他文件或程序等)。
那么我们再想一下1.1
中对“普通文件”存放方式的描述,就会有一个问题:“普通文件是放在磁盘的磁道上的,我们所谓的目录树形结构,如何在磁道级别体现呢?”
实际上,这种树形结构,并非在磁道级别去实现的,而依然是数据级别。我们假设有下面这张表,表的名字叫Home
。
序号 | 子项名称 | 子项存储起始扇区位置 | 子项存储结束扇区位置 |
---|---|---|---|
1 | Desktop | 1000 | 1500 |
2 | Pictures | 8000 | 8500 |
之后有有表Pictures
内容如下
序号 | 子项名称 | 子项存储起始扇区位置 | 子项存储结束扇区位置 |
---|---|---|---|
1 | OIP-1.jpeg | 11000 | 12000 |
2 | OIP-2.jpeg | 15000 | 16000 |
2 | OIP-3.jpeg | 18000 | 19000 |
用这两个表中的数据,是不是就可以形成一个简单的树形结构?
![](https://img.haomeiwen.com/i10420503/7a41ab687b7b8244.png)
home
、Desktop
和Pictures
这些表,是不是需要保存在文件里?我们将home
保存为一个home文件
,将Desktop
保存为一个Desktop文件
,将Pictures
保存为一个Pictures文件
。这些文件,就是目录文件。所以,目录文件保存的是一种文件之间的层级关系,当然还有其他信息,不再展开。
1.3 设备文件
设备文件是Linux用于对硬件设备进行访问和控制的文件。按照一定的规则向设备文件中写入内容,就可以控制某些设备。从设备文件中读取数据并按照相应规则解析时,就可以读取到设备的输入。
比如键盘文件,我们使用evtest
对键盘文件进行读取,当按下键盘按键时,可以读取到相应的信息。需要说明两点:
- 键盘文件是
eventXX
,具体是哪个文件,需要根据自己电脑情况尝试; - 使用虚拟机时,你需要在虚拟机内敲键盘,才会有数据的读取;在主机进行操作不会有输出。
# 查看键盘事件
sudo evtest /dev/input/event2
![](https://img.haomeiwen.com/i10420503/91b38612a321543a.png)
二、 目录操作指令
2.1 目录与路径
说到目录,我们经常会用到的几个词是:根目录
、主目录
、当前目录
、上级目录
。分别是什么意思呢?
-
根目录。是系统的最顶级目录,用
/
表示。cd / # 切换到根目录
根目录
-
主目录。主目录又叫用户主目录,我们在系统主界面直接打开shell,其实就是在根目录下。用
~
表示。主目录的最末级,是自己设置的用户名。cd ~ # 切换到主目录
主目录
-
当前目录。是你的shell指令,当前位于什么目录下。可通过shell
:
和$
之间的路径显示判断。用.
表示。
当前目录
-
上级目录。是当前目录的上一级,如上图中,当前目录的上一级为
/dev
,在上一级为/
。用..
表示。cd ../ #切换到上级目录
切换到上级目录
路径,是与目录紧密关联的另一个概念,是指的要到达你的操作对象,需要经历的目录序列;分为绝对路径
和相对路径
。
- 绝对路径。是指的从
根目录
开始,直到你要操作的对象的目录序列。 - 相对路径。是指的从
当前目录
开始,直到你要操作的对象的目录序列。
两种路径,各有其适用的情况。 - 相对路径。当你所操作的文件,位于当前路径的下层,或者位于不远的临近区域,那么适合用相对路径
- 绝对路径。当你所操作的文件,位于遥远的另一个分支,那么适合用绝对路径
依然以我们上面,键盘文件来举例。我当前位于主目录(~
),想去监听键盘文件event2
。用什么路径更方便呢?肯定是相对路径
。我们需要首先来看一下目录到达event2
和主目录的树形结构。
路径
我们当前所在目录为主目录
。可以看到,主目录是从根目录开始/
->home
->ubuntu
下来的。而我们要操作的对象,从根目录向下就和我们当前目录分离了,是/
->dev
->input
->event2
。如果我们使用相对路径去操作event2
,那么将会经历一个非常长的路径:ubuntu
->home
->/
->dev
->input
->event2
。而且其实是无意义的,因为绝对路径
就是从根目录(/
)开始的。而我们刚才的相对路径里面,其实就包含了从根目录开始,一直到event2
的一段。那么绝对路径就是:/
->dev
->input
->event2
。
sudo evtest /dev/input/event2
![](https://img.haomeiwen.com/i10420503/18eedb28f110683b.png)
如果我们位于~/Documents
下,我们要对~/Pictures
里面的图像进行操作。那么,使用相对路径就较为简单:
cd ~/Documents
ls -lh ../Pictures/OIP-1.jpeg
需要额外提到的一点是,此处的路径使用的..
开头,表示上级目录
。在我们上面已经提到。
![](https://img.haomeiwen.com/i10420503/629dbf88ebc0919d.png)
2.2 目录的操作
以下指令[]
的是可选内容,<>
是自定义内容
2.2.1 创建目录
指令为:
mkdir [-p] <目录名>
其中:
-
mkdir
-- make directory,创建目录的意思 -
-p
-- 如果添加,可以一次性创建多级目录
比如:
cd
mkdir ./mydir #可以创建一个新的名字为mydir的目录
ls
![](https://img.haomeiwen.com/i10420503/9e38688d32b0800f.png)
cd
mkdir -p ./mydir2/pic/ #可以创建一个新的名字为 mydir2 的目录,
#并在 mydir2 下面,再创建一个 pic 目录
ls && ls ./mydir2
![](https://img.haomeiwen.com/i10420503/8c90cbdbe11e2e0d.png)
2.2.2 删除目录
指令为:
rmdir [-p] <目录名>
示例,删除刚才创建的目录。
rmdir
只能删除目录。
rmdir ./mydir # 可以删除
rmdir ./mydir2 # 报错,因为下面还有一个pic目录
![](https://img.haomeiwen.com/i10420503/de344f97daf2f896.png)
加-p
删除。如果删除子目录后,父级目录为空,则把父级目录也会删除。
rmdir -p mydir2/pic # 删除成功,而且mydir2也没了
在这里,使用./mydir2/pic
和 mydir2/pic
是不同的,使用./mydir2/pic
,删除命令会把你当前的目录算作要删除的最顶级目录,会报参数错误。而使用mydir2/pic
则会只截至到mydir2
mkdir -p mydir2/pic/
rmdir -p ./mydir2/pic
依然需要一个隐含条件:pic
目录下没有东西,如果我们把里面放上东西,比如一张图片。再次尝试
cd && mkdir -p mydir2/pic/ && cp ./Pictures/OIP-1.jpeg ./mydir2/pic/
rmdir -p ./mydir2/pic
![](https://img.haomeiwen.com/i10420503/552ee5d58489c0fc.png)
可以使用如下命令,对文件夹及其内的文件进行删除。
rm -rf mydir2
![](https://img.haomeiwen.com/i10420503/e2f5ad48c49a033a.png)
2.2.3 切换目录
切换目录的指令是cd
(change directory),切换目录。 参考上述相对路径、绝对路径。
使用pwd
(print working directory)指令可以查看当前的路径。
cd <path>
pwd
2.2.4 列出目录
使用ls
,可以列出当前目录下的内容。前面已经多次使用过。其有几个参数
序号 | 参数 | 作用 |
---|---|---|
1 | -a | 显示所有包含项目,包括隐藏项目 |
2 | -l | 以长格式显示文件属性,大小等详细信息 |
3 | -d | 仅显示目录的详细信息 |
4 | -R | 递归显示出目录及其子目录的内容 |
5 | -S | 以文件大小降序排序显示文件 |
6 | -t | 以文件最近一次的修改时间排序显示文件 |
几个之前文档中不常用的指令测试
ls -lhS
![](https://img.haomeiwen.com/i10420503/d17d6783e33ce8c9.png)
ls -lhSa
.bash_history
就是隐藏文件。在上面的命令中,并没有显示出来。但在目前的文件中显示出来了。
![](https://img.haomeiwen.com/i10420503/dff222eee4014bb4.png)
ls -lhSR ./Pictures
![](https://img.haomeiwen.com/i10420503/54fde064909b6867.png)
ls -lhSRd */
![](https://img.haomeiwen.com/i10420503/1fac047e97790dd4.png)
ls -lhSR */
![](https://img.haomeiwen.com/i10420503/6c30063bc51c4b1b.png)
网友评论