【Linux系统】—— 基本指令(一)
【Linux系统】—— 基本指令(一)
- 1 「ls」指令
- 1.1 初识 「ls」 指令
- 1.2 「ls -l」
- 1.3 认识文件
- 1.4 「ls -l」显示的内容
- 1.5 如何区分文件类型
- 1.6 「ls -a」
- 1.7 混合使用命令行选项
- 1.8 「ls」查看指定目录下文件
- 1.9 「ls」 指令常用命令行选项
- 2 「pwd」 指令
- 2.1 「whoami 」指令
- 3 「cd」 命令
- 3.1 初识 「cd 」命令
- 3.2 再探 『 . 』 和 『 .. 』目录
- 3.3 根目录
- 3.4 绝对路径与相对路径
- 3.5 「cd ~」与「cd -」
- 4 「touch」 命令
- 4.1 初识 「touch」 指令
- 4.2 文件的时间
- 4.2.1「stat」 指令
- 4.2.2 文件的三个时间
- 4.3 「touch」 指令命令行选项
- 5 「mkdir」 命令
- 5.1 初识 「mkdir」
- 5.2 「mkdir」 创建一串路径
- 5.3 「tree」 命令
- 6 指令的本质
1 「ls」指令
1.1 初识 「ls」 指令
- 语法:「ls」 [选项] [目录或文件]
- 功能:对于
目录
,该指令列出该目录下的所有子目录与文件。对于文件
,该指令列出该文件名及其相关信息
简单来说,「ls」 指令就是显示当前目录下的文件。
- 那么目录是什么呢?
这里补充一个重要的知识点:
在 Linux 中,目录相当于 windows 中的文件夹
目录 == 文件夹
- 当前目录:当前我这个用户所处的目录
好比当前你问我在哪里,我回答我在我家里,我家在某市某区某单元。我们人类世界中,地址就是一个典型的目录,它是用来定位你当前在哪里。Linux 中的目录也是一样的
如果当前目录下没有任何文件或目录即一个空目录(空文件夹),ls 是不会显示任何东西的
1.2 「ls -l」
其实,在 「ls」 后面加上 「-l」 也可以显示当前目录下的文件或目录
我们发现,仅仅只有 「ls」 指令,只显示当前目录的文件名或目录名;而 「ls -l」 前面还显示出了一堆信息,虽然现在的我们也许还看出懂这些信息的含义。
我们先来介绍一些基本的概念:
我们在命令行中:输入的 「ls」 字符串,我们称之为命令
;而后面的 「-l」 (「ls」和 「-l」中间有个空格不要忘记),这种以 「-」 开头的,我们将其称为命令行选项
。命令行选项可以是0个或多个
,多个命令行选项都是用空格隔开
的。
「ls」默认只会显示文件名(目录名),而「ls -l」则显示文件名和更多的内容
1.3 认识文件
既然加上「-l」可以显示文件的更多内容,那么文件又有什么内容呢?
现在我问大家一个问题:windows 系统中,我们新建一个空文件,里面没有任何内容,这时它要不要在磁盘上占用空间呢?
答案是要占据磁盘空间
文件,除了我们经常关心的文件内容,
文件还有文件名、日期,类型、大小等等
其他很多东西
像文件名,文件类型,修改时间等等这些,我们称之为文件的属性。而文件的属性也是数据,这些数据也是要被存储下来的。
什么是属性呢?就好比一个人的身高、体重、性别、籍贯等,这些就是一个人的属性,这些信息在你的学校中都会记录下来,你的学籍档案中都有。
所以不要认为一个文件,磁盘只存储文件中的内容,磁盘存储的是文件的属性加内容。
上述图片中大小显示的是 0 字节,这仅仅统计的是文件内容的大小,而文件的实际大小还要加上文件的属性
我们得出的结论是:文件 == 内容 + 属性。
既然 文件 == 内容 + 属性,未来我们学习文件的时候,要么是对文件的内容进行操作,要么是对文件的属性进行操作
1.4 「ls -l」显示的内容
对文件有了更进一步的了解后,我们来看看「ls -l」所显示的内容
「ls」只会显示文件(目录)的文件名,而「ls -l」还会进一步显示文件(目录)的属性
「ls」命令更准确来说是显示文件(目录)的属性
;只有「ls」,只显示文件名这一属性;加上「 -l」显示更多属性
1.5 如何区分文件类型
Linux 中是如何区分文件的类型呢?我怎么知道他是普通文件
还是目录
呢?
在 windows 系统中,我们可以直接看出来,因为 windows 系统中每一个文件都有它对应的后缀(.zip、 .pdf、 .txt、.jpg)
而 Linux 并不是通过后缀来区分,它一般通过「ls -l」指令显示出的信息中的 第一大列的第一个字符来区分。
如图:
如果第一个字符是 「d」,表示它是一个 目录;如果是 「-」 表示它是一个 普通文件。
这里,我们暂时只介绍这两种文件
我们也可以看到,Linux 默认将目录标记为蓝色;普通文件不做处理,依然是白
1.6 「ls -a」
这里我们再介绍一个选项:「-a」
我们先来看看输入 「ls -a」 命令会发生什么
我们发现又多了两个目录(他们是 d 开头):『 . 』 和 『 . . 』
现在我们进入空目录中(怎么进入等会介绍),我们知道对于空目录「ls」是不进行任何显示
现在我们加上命令行选项「-a」会发生什么呢
发现依然是多了两个目录:『 . 』 和 『 . . 』
为什么「ls」看不到,而「ls -a」可以看到 『 . 』 和 『 . . 』 呢?
我们先来介绍一下 隐藏文件(目录)
在 Linux 中,以 『 . 』开头的文件(目录)叫做 隐藏文件(目录)。
所以「ls -a」就是显示包括隐藏文件(目录)在内的所有文件(目录)
而 『.』和 『.. 』目录都是以 『.』 开头,是隐藏文件,「ls」与「ls -l」是不会查看隐藏文件(目录)的
至于『.』 和 『..』目录是什么,我们后面再介绍
1.7 混合使用命令行选项
前面我们知道命令行选项可以是多个,那可不可以「-a」和「-l」同时使用呢?是可以的
那「-l」再「-a」呢?是可以的,而且效果一模一样
不仅如此,还可以省略写法:「ls -la」及 「ls -al」
Linux 的指令,绝大部分的指令所带的选项(命令行选项),是否分开写、是否连着写、是否按顺序写完全没有关系
1.8 「ls」查看指定目录下文件
「ls」默认查看的是当前目录下
的文件
「ls」后面也可以指定目录,查看指定目录下的文件
1.9 「ls」 指令常用命令行选项
- 「-a」:列出目录下的所有文件,包括以 . 开头的隐藏文件
- 「-d」:将目录像文件一样显示,而不是显示其下的文件。如:「ls -d」 指定目录
- 「-i」:输出文件的 i 节点的索引信息。如 「ls -ai」 指定文件
- 「-k」:以 k 字节的形式表示文件的大小。「ls -alk」 指定文件
- 「-l」:列出问价的详细信息
- 「-n」:用数组的 UID,GID 代替名称。(介绍 UID,GID)
- 「-F」:在每个文件名后附上一个字符以说明该文件的类型,“*” 表示可执行的普通文件;“/” 表示目录;“@” 表示符号链接; “|” 表示 FIFOs;“=” 表示套接字(sockets)。(目录类型识别)
- 「-r」:对目录反向排序
- 「-t」:以时间排序
- 「-s」:在 I 文件名后输出该文件大小。(大小排序,如何找到目录下最大的文件)
- 「-R」:列出所有子目录下的文件。(递归)
- 「-1」: 一行值输出一个文件
2 「pwd」 指令
但 Linux 系统,我怎么才能知道自己当前所处的路径(所处的目录)是哪个呢?
这时就可以用到 「pwd」 指令
- 语法:「pwd」
- 功能:显示用户当前所在的目录(所处路径)
当我们用超级用户(root)
登录系统时,我们默认在 /root 目录下
当我们用普通用户
登录系统时(假设是user1),默认是在 /home/user1 目录下
- 我们知道,在 windows 中是用 「 \ 」 作为路径分割符
- 而在 Linux 中,则用 「 / 」 作为路径分割符
- 在两个「 \ 」(windows)或两个「 / 」(Linux) 之间的一定是一个文件夹(目录)
- 所谓路径本质就是由 多个目录 构成的
- 而路径的
最末端
(如上述 user1)有可能是目录,也有可能是普通文件
2.1 「whoami 」指令
这里我们补充一条指令
- 语法:「whoami 」
- 功能:显示当前用户名称
3 「cd」 命令
3.1 初识 「cd 」命令
- 语法:「cd」 目录名
- 功能:改变工作目录,将当前工作目录改到指定目录下
既然「cd」是改变目录,那肯定要知道变成什么样子,因此「cd」后面要加指定目录的目录名
如:我现在在 113目录 下,通过「cd」进入到 root目录 下
3.2 再探 『 . 』 和 『 … 』目录
前面我们知道『 . 』 和 『 .. 』是隐藏目录,但是他们又是什么呢
现在我们来正式了解一下
- 在 Linux 中,任何一个目录(包括空目录)系统都会默认自带两个目录:『 . 』 和 『 .. 』
- 『 . 』 和 『 .. 』是隐藏目录,他们是以『 . 』开头,正常来说看不到
- 『 . 』表示当前目录;『 .. 』表示上级目录
先来看『 . 』(当前目录)
可以看到,输入cd .
我们一直在当前路径下
我们再来看『 .. 』(上级目录)
可以看到输入cd ..
,我们不断往上级目录退 。
相信『 . 』 和 『 .. 』很好理解,这里就不再过多赘述了
3.3 根目录
但是我们能一直回退吗?
我们发现,回退到一定程度时,就回退不了了,这时因为回退到了根目录。
前面我们曾说 「 / 」 是路径分割符,但是有一个 「 / 」 非常特殊:整个路径中最开始的 「 / 」
Linux 中,我们将路径中 第一个「 / 」称为根目录 。
Linux的目录结构由「 / 」开始
而根目录本质也是一个文件夹,既然是文件夹,那它里面肯定也是可以放文件和文件夹的
我们可以通过 「ls」 看看根目录的文件
所以 Linux 的文件结构,是一棵从根目录「 / 」开始的多叉树
这棵树的 叶子结点 一定是普通文件或者是空目录;非叶子结点 一定是一个非空目录!
3.4 绝对路径与相对路径
上图中,我们想找到 test.c 文件怎么找呢。
是通过路径来找的:/home/bit/test.c
为什么能这样找呢?因为一个节点虽然能有多个孩子,但只能有一个父亲,所以从叶子结点逆向地向回找,该路径具有唯一性
我们把这种从根目录开始一直定位到目标文件的方式,我们称之为:绝对路径。
这里我们再来聊聊路径这一概念:linux 中我们要访问一个文件,前提是你先找到他,而找到一个文件我们必须要通过路径来找到。这就是为什么 windows 和 linux 下都要谈路径。而绝对路径具有唯一性,所以我们通过绝对路径可以快速找到一个文件。
在 linux 中要找到一个文件,除了绝对路径还有一种方式:相对路径
相对路径:以当前目录为参照位置,定位一个文件
比如 cd ..
就是以当前目录为参照点,返回当前目录的上级目录,这就是一个相对路径
注:使用相对路径可以 cd 「文件(目录)名」 或 cd 「./」+「文件(目录)名」 。如 cd ./113
或 cd 113
都是可以的
绝对路径一般在 linux 系统重配置文件
来使用
相对路径我们日常操作
用的多,因为比较简单
3.5 「cd ~」与「cd -」
「cd」命令除了使用绝对和相对路径,还可以使用两个特殊符号:~
和-
- 「cd ~」 :进入当前用户自己的家目录
这里先简单介绍一下家目录:任何一个 linux 用户,用特定的用户名登录系统时,默认在家目录下。
以超级用户登录(root账号),默认在 /root
路径下
以普通用户登录,默认在 /home/用户名
路径下
- 「cd -」:返回最近所处路径
4 「touch」 命令
4.1 初识 「touch」 指令
- 语法:「touch」 [选项]… 文件…
- 功能:「touch」命令可以更改文档或目录的日期时间,包括存取时间和修改时间;或者新建一个不存在的文件
「touch」是用来 创建普通文件 的:
例如:创建新文件 hello.txt
但是 「touch」命令不能创建文件夹
此外「touch」命令还可以更新一个文件所对应的时间
4.2 文件的时间
现在我们知道文件包括文件内容和文件属性,其中文件属性中有一种属性是非常重要的:文件时间
文件的时间如果乱了,那这个系统就乱了。任何一个文件新建的时候都要有自己时间的概念。
一般文件的时间有三种,怎么查看呢?这里我们介绍一个新指令:「stat」
4.2.1「stat」 指令
「stat」 就是 state(状态)的意思:显示一个文件或目录的属性。
通过 「stat」 指令,我们就可以看到一个文件详细的属性介绍啦
4.2.2 文件的三个时间
虽然上面显示出的文件属性我们很多看不懂,但没关系,今天我们来看看文件的三个时间:
文件一般都有三种时间:Access时间
、Modify时间
、Change时间
。为了方便记忆,这三个时间可以记为:ACM时间
在 Linux 系统中,文件的属性通常与文件的访问、修改以及状态改变相关联。具体来说,access、modify(有时也称为 change,但在此上下文中我们通常区分两者)、change(这里特指 inode change time)指的是文件的不同时间戳,它们各自代表了文件的不同方面的变化。
- Access Time (atime):
- 访问时间是指文件数据最后一次被读取(访问)的时间。这包括使用如 cat、more、less 等命令查看文件内容,或者使用 grep 等命令搜索文件内容时的最后一次操作时间。然而,值得注意的是,很多文件系统(特别是挂载时使用了 noatime 或 relatime 选项的文件系统)为了减少磁盘写入操作,可能会优化或忽略 atime 的更新。
- Modify Time (mtime):
- 修改时间是指文件内容最后一次被修改的时间。这包括了对文件内容的任何写入操作,如使用文本编辑器修改文件、向文件中追加数据等。mtime 是文件内容变化的直接反映。
- Change Time (ctime):
- 状态改变时间(或 inode change time)是指文件的状态( inode 信息)最后一次被改变的时间。这不仅仅包括文件内容的修改(这也会更新 mtime),还包括了文件权限、所有者、链接数(有多少文件名链接到 inode)等的改变。简而言之,任何导致文件 inode 信息发生变化的操作都会更新 ctime。因此,即使文件内容没有改变,但如果其权限或所有者等属性发生了变化,ctime 也会更新。
4.3 「touch」 指令命令行选项
- 「-a」:或 --time = atime 或 --time=access 或 --time=use 只更改存取时间
- 「-c」:或 -no-create 不建立任何文档
- 「-d」:使用指定的日期时间,而非现在的时间
- 「-f」:此参数将忽略不予处理,仅负责解决 BSD 版本 「touch」 指令的兼容性问题
- 「-m」:或 --time=mtime 或 --time=modify 只更改变动时间
- 「-r」: 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同
- 「-t」:使用指定的日期时间,而非现在时间
5 「mkdir」 命令
5.1 初识 「mkdir」
- 语法:「mkdir」 [选项] dirname…
- 功能:在当前目录下创建一个名为 “dirname” 的目录
「touch」 命令是创建一个普通文件,而「mkdir」则是创建一个目录
5.2 「mkdir」 创建一串路径
直接用「mkdir」创建一个目录很简单,这里就不再多说了。如果我想创建一串路径,比如:当前我在 newdir 目录下,我想在当前目录下创建 a/b/c 路径,「mkdir」可以做到吗。
我们试一试
可以看到,直接这样创建是不行的。「mkdir」无法一次性创建这样的路径,它无法创建目录的结构
如果要创建一串目录的结构,我们可以用到命令行选项:「-p」。「-p」可以一次性创建一串路径
- 「-p」:-parents 可以是一个路径名称。此时若路径中某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
我们来试试
可以看到是成功创建了的,我们是可以进入到 a、b、c 目录下的
5.3 「tree」 命令
像上面我们分别进入到 a、b、c 目录下去查看目录太过繁琐,也不够直观。有没有什么方式可以只看看出当前目录的结构呢?这时我们就可以使用 「tree」命令
在 Linux 系统中,「tree」命令是一个非常有用的工具,用于以树状图的形式递归地列出目录的内容。这个命令可以非常直观地展示目录结构,包括子目录和文件,以及它们的层级关系。
如:
「tree」 命令默认显示当前目录下的结构,当然,后面可以加上路径,查看指定目录的目录结构
需要注意的是,在默认情况下,Linux 系统可能并不自带「tree」命令,但我们可以通过你的 Linux 发行版的包管理器来安装它。
centos 可以通过输入代码:yum install -y tree
来安装;ubuntu 可以通过输入代码:apt install -y tree
来安装
6 指令的本质
前面讲了这么多,相信大家对指令已经有了模糊的概念,但是指令的本质是什么呢
「which 」指令可以帮助我们了解指令的本质
Linux 中的 「which 」 指令是一个常用的命令,主要用于 查找并显示指定命令的绝对路径。
先讲结论:命令本质上就是我们系统中的文件! 而且是以 「- 」开头,我们称之为普通文件。也就是说当我们在系统中执行对应的命令时,实际上这一个个命令就是一个个文件罢了!
命令(指令)就是文件!
那这样的话,我们直接输入指定命令的路径,也可以实现相关功能咯?
确实如此
命令的本质 == 可执行文件 == 我们写的C/C++程序
命令本质上就是别人用 C/C++ 等语言写出来的可执行程序罢了
那是不是意味着我们自己写一个简单的C代码,生成一个可执行文件也可以跑起来呢?
我们试一下
可以看到,我们输入相关路径,确实执行了 C语言 代码
为什么要加 「./」 呢?因为要执行一个命令就要先找到这个命令,而我们自己写的 mycmd 命令就在当前目录下的 mycmd 文件
可是系统命令也是可执行程序,为什么可以不用带路径就可以直接执行呢?
我们将 mycmd 命令拷贝到 /usr/bin
目录下,发现它也可以不带路径,像命令一样运行
我们刚刚安装了 「tree」 命令,安装命令的本质就是将其从网络里下载下来,将其拷贝到指定的 /usr/bin
目录下,「tree」 命令就能直接跑了。
刚刚我们将 mycmd 拷贝到 /usr/bin 目录下,本质就是在做 linux 下的软件安装。其实 大部分的安装都只是拷贝罢了,将相应文件拷贝到指定目录下
好啦,本期关于基本指令的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在 Linux 的学习路上一起进步!