Linux系统编程--基础指令(!!详细讲解+知识拓展)
第一讲 基础指令
我们现如今自己使用的电脑大部分是用的都是windows或者macOS,并配合上由微软和苹果开发的图形化界面,所以使用鼠标再屏幕上进行点击即可完成许多任务。但是作为操作系统的学习者,在linux的基础上不再使用图形化界进行操作,那么应该如何控制呢?这里就需要借助linux指令通过在命令行进行操作,即可。
这也表明了各种操作系统的本质都利用各种指令进行开发,现如今的各种图形化界面都是为了降低使用者的使用门槛,但是作为操作系统的学习者,应该坚持使用指令完成各种操作。
下面便开始介绍一些常用的基础指令。
1. ls指令
语法: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:在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)
- -R:列出所有子目录下的文件。(递归)
- -1:一行只输出一个文件
指令演示:
如上图我们使用了ls
、ls -l
、ll
这三个指令,其中ls
仅仅是列出了文件和目录的名称,但是ls -l
和ll
的显示内容相同,并且是显示了更加详细的文件属性信息。
这里在使用了-a
选项之后,增加了需要以.
开头的文件,这些文件是隐藏文件。
以上介绍了-l
和-a
这两个选项的使用实例,后面的各种选项的使用可以在平时的使用中边用边学习。
因为以上两张图里一共ls
指令进行查询的都是目录中包含的信息,如果需要直接查看次目录本身的信息,可以使用选项-d
实现。
补充知识:
文件:
文件 != 文件内容
,如上图创建了code.c
和file.txt
这两个文件但是还没有向这两个文件写入信息,所以此时的文件内容大小是0个字节,但是文件的实际大小并不是0。文件 = 文件内容 + 文件属性
,他们都是数据,是数据就会占用磁盘空间。其中文件属性包括文件大小、类型、权限、创建时间等数据。- 所以对文件操作也可以分为对
文件内容
和文件属性
进行操作。
指令复合使用:
- 图一中
ls -l
等价于ll
,基于这个原则,其他与-l
搭配的复合选项也可以被简写,如ls -al
也可以写成ll -a
。 - 图二中的
-l -a
的使用效果和-al
或者-la
使用功能效果一致,说明选项可以组合传入也可以分别传入,并且选项的前后并不会影响最终作用。
文件颜色区分:
- Linux 中,正常颜色为普通文件,蓝色为目录。
文件夹和目录:
- Linux中的目录其实也就是,windows中的文件夹,这两个是一个概念。
隐藏文件:
- 隐藏文件在windows操作系统里也被广泛使用,起作用主要是用于保存一些系统的基础配置文件,防止用户平时在使用
Ctrl+A
等快捷键进行全选操作时,对系统配置文件进行删除和修改。 - Linux 中以 . 开头的文件是隐藏文件,单独的一个
.
是当前目录,单独的..
是上级目录。
每行文件开头的d
和-
的含义:
- 以
d
开头:普通文件 - 以
-
开头:目录
2. pwd指令
语法:pwd
功能:显示用户当前所在的目录
常用选项:pwd 命令的功能与使用都十分简单,也没有附加选项
指令演示:
这里表示此时使用者所在的路径是/root/test
。
补充知识:
- 这里的
/
是路径分隔符,在windows也存在路径分隔符但是是\(反斜杠)
但是这种方式并不规范因为它会与转义字符\
发生冲突。
3. cd指令
语法:cd [目录名]
功能:改变工作目录。利用绝对路径或者相对路径将当前工作目录改变到指定的目录下;
常用选项:和 pwd 指令一样,cd 指令也没有选项,其功能和使用同样十分简单。
指令演示:
上面演示使用cd
指令,前往各个目录的方法。
补充知识:
相对路径和绝对路径:
- **相对路径:**以操作者当前所处的位置为参照点,查找定位目标文件的路径。
- **绝对路径:**从根目录开始,依次按树状结构向后进行查找定位目标文件的路径。
- 绝对路径一般不会随着用户的路径变化而丧失唯一性,一般在特定服务的匹配文件中经常被使用。相对路径因为它的便携性,一般在命令行中使用较多。
路径的理解:
-
在操作系统中,访问一个文件的前提是先找到它,再操作它,然而定位或者说是找到这个文件的方式就是路径。
-
Linux 系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件,其中普通文件一定是目录树的叶子节点,目录可能是叶子(空目录),也可能是路上节点。
理解路径存在的意义:树状组织方式,都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案来进行定位文件。
**其中任何一个节点,都只有一个父节点,**所以,从根目录开始,定位指定文件,路径具有唯一性。
-
不管是 Linux 还是 Windows,其磁盘中的文件和目录的结构都是树状结构 (多叉树),因为在树状结构中,得到一个文件/目录的路径是唯一的,那么就可以用路径来唯一标识一个文件/目录。下面便是Linux的树状目录结构。
.
和..
的介绍:
-
在Linux系统中,任何目录都存在
.
和..
,因为可能在任何一个目录下都需要去运行可执行文件(找到他自己)都需要回退至上一级目录(找到其父节点)。 -
..
:..
的作用是指向上级目录。其的存在保证了此目录既可以从根目录开始利用绝对路径找到,也可以通过..
一层层返回上级路径直至根节点。**注意:**根目录
/
利用指令cd ..
还是指向其自己本身,这里Linux系统就是这样设定的。 -
.
:.
的作用是指向此目录本身。例子:因为如果需要执行一个二进制文件(a.out)首先需要将其先加入内存,然而加入内存的前提是先找到它,但是Linux默认即使此文件在当前路径下也无法找到此文件,所以此时输入./a.out
即可找到此文件并执行。所以.
保证了可以找到此目录下的二进制执行文件加载并运行它。
家目录:
-
使用不同的账户登录操作系统,其进入的初始路径并不一样。
如:
root账号默认所处路径为
/root
,普通用户账号默认所处的路径为/home/用户名
。把这种路径叫做特定用户的家目录。可以理解为root账号住的是别墅,初始默认路径就是
/root
,此路径只给root账号一个人使用;然后普通用户住的就是公寓,默认路径是在/home/用户名
路径下,所有创建的普通用户都在/home
这一个目录当中。 -
**家目录的理解:**保存用户私有信息,默认登录的时候,所处的路径。每一个用户都需要有一套自己的默认目录,自己的默认目录需要在自己的路径下维护好。
-
cd ~
:这个指令表示,前往指定用户的家目录。 -
cd -
:这个指令表示 可以切换回最近的一次路径。
4. touch 指令
语法:touch [选项] 文件名
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件;
常用选项:
-a: 或 --time=atime 或 --time=access 或 --time=use 只更改存取时间;
-c: 或 --no-create 不建立任何文档;
-d: 使用指定的日期时间,而非现在的时间;
-f: 此参数将忽略不予处理,仅负责解决 BSD 版本 touch 指令的兼容性问题;
-m: 或 --time=mtime 或 --time=modify 只更改变动时间;
-r: 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同;
-t: 使用指定的日期时间,而非现在的时间;
指令演示:
可以通过此指令向此目录下添加普通文件,并可以利用ls指令查看。
还可以通过此指令修改文件的时间,如上图所示。
补充知识:
Linux中的文件类型:
- 以
-
开头的文件类型叫做普通文件。如文本文件(code.txt)、二进制可执行程序(a.out)、动静态库、视频、音频、图片… - 以
d
开头的叫做目录,也就是文件夹。
Linux中的文件后缀:
-
Linux系统中,文件类型与文件后缀无关。
- 如前面提到的
a.out
二进制可执行程序,在使用指令./a.out
之后即可加载执行。如果这里把a.out
改名为a.txt
、b.png
甚至是b
,均可以在使用路径找到此文件后加载执行。并不会因为其文件后缀发生更改而发生和windows中一样的报错,而导致无法执行。
- 如前面提到的
-
因为
系统 != 软件
,Linux系统中的软件如gcc
等编译器软件,是对文件后缀有要求的。 -
综上,在平时的开发过程中还是应该带上合适的文件后缀。
touch 只能用来创建普通文件,不能创建目录。
5. file 指令
语法:file [选项] 文件名
功能:file命令用于辨识文件类型,可以检测给定文件的类型,它会分析文件的内容特征并输出文件类别的描述信息。
常用选项:
-b: 或 --brief 显示简短格式的输出,不显示文件名;
-c: 或 --checking-printout 详细显示指令执行过程;
-f: 或 --files-from 从指定文件中读取待检测的文件名列表;
-i: 或 --mime 输出MIME类型字符串;
-k: 或 --keep-going 不在第一个匹配后停止,继续尝试匹配;
-L: 或 --dereference 跟随符号链接;
-m: 指定魔数文件列表;
-z: 或 --uncompress 尝试查看压缩文件的内容类型;
指令演示:
利用file
指令即可查看文件的描述信息,进而进一步可以判断出具体的文件类型。
6. stat 指令
语法:stat [选项] 文件名
功能:stat命令用于显示文件或文件系统的详细状态信息,包括文件的大小、块数、I-node信息、权限、链接数、所有者、组以及各种时间戳(如访问时间atime、修改时间mtime、改变时间ctime)等。
常用选项:
-c: 或 --format 使用指定的格式字符串来显示信息;
-f: 或 --file-system 显示文件系统而不是文件的状态;
-L: 或 --dereference 跟随符号链接,显示链接指向的文件或目录的状态;
-t: 或 --terse 以简洁(terse)格式显示信息;
–cached=WHEN: 显示缓存的时间戳(如果可用);
指令演示:
可以使用此指令查看更加详细的文件信息,其中便包括如图的ACM时间。
补充知识:
ACM时间:
- 最近访问时间(Access):cat、less等查看文件后,该时间改变;
- 最近更改时间(Modify):使用 nano/vim 等编辑器修改文件内容后,三个时间都改变;
- 最近改动时间(Change):chmod 修改文件权限或属性后,该时间改变;
7. mkdir 指令
语法:mkdir [选项] 目录名
功能:在当前目录下创建目录;
常用选项
- -p :–parents 可以是一个路径名称;此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;
指令演示:
可以通过此指令向此目录下添加空的子目录,并可以利用ls指令查看。
补充知识:
如何建立一个路径(a/b/c/d)?
- **方式一:**一个一个进入目录,并在每个父目录中使用指令
mkdir
建立新的子目录,不断循环,直到路径形成。 - **方式二:**利用指令
mkdir -p a/b/c/d
可以直接创建一条路径。
8. tree 指令
语法:tree [选项] [目录]
功能:以树状格式展示出指定目录的内的文件和目录结构;
常用选项
-a:列出所有文件,包括隐藏文件、目录;
-C:在文件和目录清单上加上色彩,便于区分文件类型;
-d:仅列出目录名称,而非内容;
-D:列出文件或目录更改时间;
-L:目录树的最大显示深度;
-p:打印结构的同时打印文件权限;
-l:跟随目录的符号链接,就像它们是目录一样,避免导致递归循环的链接;
-f:打印每个文件的完整路径前缀;
-F:在每个条目后加上文件类型的指示符(如目录是/);
指令演示:
补充知识:
tree
指令的安装:
-
**报错:**默认的Linux系统中
tree
指令默认是没有安装的,所以直接使用此指令会报错。 -
**安装:**保证是root账号的情况下,在centos系统中,使用指令
yum install -y tree
,即可下载。保证是root账号的情况下,在Ubuntu系统中,使用指令
apt install -y tree
,即可下载。
9. rmdir指令
语法:rmdir [选项] [dirName]
适用对象:具有当前目录操作权限的所有使用者;
功能:删除目录;
常用选项
- -p:当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除;
指令演示:
利用指令删除空目录tcqdir
。
注意:rmdir
只能删除空目录,意义不大。
10. rm指令
语法:rm [选项] [文件名/目录名]
适用对象:具有当前目录操作权限的所有使用者;
功能:删除文件或目录;
常用选项
- -f:不进行确认直接删除文件,即使文件属性为只读(即写保护);
- -r:删除目录及其下所有文件 (递归删除);
- -i:删除前逐一询问确认;
指令演示:
如上图,Linux中的删除指令只需要记住一条**rm -rf [目标文件]
**
11. man指令
Linux的命令有很多参数,我们不可能全记住,可以通过查查看手册获取帮助
语法: man [选项] 命令
常用选项:
- -k 根据关键词搜索帮助
- num 只在第num章节查找
- -a 将所有章节的都显示出来,比如man printf 它缺省从第一章节开始搜索,知道就停止,用选项,按下q退出,它会继续后台搜索,直到所有章节都搜索完毕
解释一下: man手册分为9章(不同系统可能会有差别)
- 是普通的命令
- 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数, 需要加什么头文件)
- 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件
- 略
- 是指文件的格式,比如passwd,就会说明这个文件中各个字段的含义
- 是给游戏留的,由各个游戏自己定义
- 是附件还有一些变量,比如environ这种全局变量在这里就有说明
- 是系统管理用的命令,这些命令只能由root使用,如ifconfig
- 略
补充知识:
man指令的安装:
- man 指令在云服务器上一般是不完整的,需要安装后才能正常使用,在
centos
系统下安装命令是 “yum install -y man-pages
”,且此命名只能由 root 用户来安装或者使用。
man指令的查找的相关介绍:
- man 如果不指定具体章节就会默认从一号手册开始找,直到找到才停下;如果指定了章节,就只会在该章节里面去找。
- 由于Linux是用C语言实现的,所以man中默认包含了C语言的函数手册;如果要查看其他语言,如C++/java/python则需要先在Linux中安装,不过这里建议直接到对应语言的官网中去查找。
- man 手册有汉化版的,不过目前只能汉化一号手册;但是我们作为一个程序员,应该具备基本的阅读英语文档的能力,所以我不建议大家去汉化,而是从现在开始慢慢去养成阅读英语文档的习惯。
- 使用完 man 指令进行对应文档后,按 q 键即可退出文档。
12. echo 指令
语法: echo [选项] [字符串]
功能:在终端显示指定的字符串**(可被重定向)**
说明:
echo
命令用于在终端输出指定的字符串或变量内容。- 可以通过使用不同的选项来控制输出的格式,如换行符、特殊字符等。
常用选项:
-n
不输出结尾的换行符,默认情况下echo
会在输出后自动换行。-e
允许解析反斜杠转义字符,如\n
、\t
等。-E
禁用反斜杠转义,通常与-e
配合使用。
指令演示:
用echo
指令即可完成将字符串显示在终端上。
补充知识:
首先要了解重定向就需要认识到一个基本信息,Linux下,一切皆文件。
-
打印到显示器 --> 显示器也是文件 --> 写入到显示器文件
-
从键盘中读取 --> 键盘也是文件 --> 从键盘文件中读取数据
输出重定向(重要!!!):
-
写入的目标文件不存在:
所以上述的将字符串打印到显示器上,本质是echo将字符串默认写入到显示器文件,那么在使用了
>
进行重定向操作之后,就可以将字符串写入到指定文件中。并且如果此时的路径底下指定文件不存在,就会先新建这个指定文件,再将字符串写入此文件中。这个过程也叫做输出重定向。
-
写入的目标文件已存在并且不为空:
如果此时目标文件已经存在,并且其中已经有内容,
echo
将字符串插入到目标文件的时候,就会先删掉目标文件原来的内容,再将字符串写入目标文件(先清空再写入)。 -
清空文件和新建文件的另一种方式:
因为如上已经知道在使用
>
可以将目标文件先清空再写入,所以直接使用>
再接要清空的目标文件,就可以实现清空文件的目的。同时,以这种思路新建文件也就相当于清空一个不存在的目标文件,因为目标文件不存在所以会先创建次新文件,再清空。也就实现了新建文件的目的。
清空文件、新建文件:> 文件名
-
其他命令与文件输入:
经过以上知识的铺垫,可以更加深入延伸一些,之前在调用
ll
指令的时候,会将此目录下的详细文件信息显示在显示器上,也就是可以理解为ll指令就是默认将此事目录下的详细文件信息写入显示器文件,也就意味着结合>
就可以改变输出的目的文件,实现将详细文件信息写入其他文件的目的。
追加重定向:
在前面介绍写入目标文件的相关知识的时候,已经介绍了,如果对一个已经存在内容的文件执行写入操作,会将旧的内容覆盖为新的内容。
但是如果在开发过程中需要再已经存在内容的目标文件中,想在已经存在的内容后面继续输入内容,则需要涉及追加重定向>>
。
追加重定向的本质也是写入操作。
13. cat 指令
语法:cat [选项] 文件名...
功能:cat命令用于连接文件并打印到标准输出设备上,常用于显示单个文件的内容,或者将多个文件的内容连接起来显示或重定向到另一个文件。
常用选项:
-A: 或 --show-all 等价于 -vET,显示所有控制字符(包括换行符和制表符);
-b: 或 --number-nonblank 对非空白行输出进行编号;
-E: 或 --show-ends 在每行末尾显示 $;
-n: 或 --number 对输出的所有行进行编号;
-s: 或 --squeeze-blank 压缩连续的空白行,只显示一行空白;
-T: 或 --show-tabs 将制表符(TAB)显示为 ^I;
-v: 或 --show-nonprinting 显示非打印字符(除了 LFD 和 TAB);
补充知识:
在介绍echo
指令的时候,补充了很对输入重定向的相关知识,但是其本质都是对制定目标文件进行写入操作。那么下面就对指定目标文件的读取操作进行详细解析。
输入重定向:
-
读取显示器文件:
在仅仅输入指令
cat
之后,并不会显示内容,此时光标跳转到下一行,等待用户输入数据,将任意数据输在显示器上之后,此时用户已经将数据写入显示器文件,cat
指令默认从显示器文件中读取数据,并将其显示。如果想要退出读取模式需要同时按下
Ctrl + C
。 -
读取指定目标文件:
使用
<
后面接想要读取的目标文件的文件名,即可实现从制定目标文件读取数据,并将其显示在显示器上。
14. tac指令
语法:tac [选项] 文件名...
功能:tac命令用于将文件内容按行逆序输出,即从最后一行开始打印到第一行。它是cat命令的逆序版本。常用于查看日志文件等,以便快速查看最新的内容。
常用选项:
-s STRING: 或 --separator=STRING 使用 STRING 作为记录分隔符,而不是换行符。
-b: 或 --before 将分隔符 STRING 放在记录之前,而不是之后(与 -s 结合使用)。
-r: 或 --regex 将分隔符 STRING 解释为正则表达式(与 -s 结合使用)。
补充知识:
查看文件的方式:
-
小文件:例如程序员自己编写的.c/.cpp/.conf文件,不想利用nano、vim等软件打开,因为有可能会误操作这些文件,只是想简单的查阅,使用
cat/tac
即可。 -
大文件:如果是大文件(eg:日志等)使用
cat/tac
等指令会会直接刷屏到最后,不方便查看,所以就可以用指令more/less
(后面的18、19做详细介绍)
日志:
简单来说,可以理解为一段程序,每天都有写日记的习惯,会将今天所做的事、执行的动作都记录下来,写进日记里,这个日记就叫做日志。作为程序员可以根据日志中的时间行为等信息可以排查出程序的错误。
在Linux系统中,本身作为一个大的项目,其也是存在日志的。可以使用指令cat ls/var/log/messages*
即可看到详细日志信息。(注意会刷屏可以按Ctrl + C
停止)
15. cp 指令
语法: cp [选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
说明:
- cp命令用于复制文件或目录
- 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中
常用选项:
-f
或--force
强制复制文件或目录,不论目标的文件或目录是否已经存在-i
或--interactive
覆盖文件之前先询问用户-r
递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录为符号链接,则一律视为普通文件处理
指令演示:
拷贝普通文件:
拷贝目录:
复制时使用-r
:目录lesson3
是树形结构,需要使用递归拷贝。
复制时使用-f
:拷贝的目录及其子文件已经在目标路径下存在,如果强行拷贝系统会向我们确认,此时可以使用 -f
强制拷贝。
补充知识:
拷贝重命名:
使用指令cp src dir/新的名称
,即可实现拷贝重命名的操作。
指令的本质:
指令的本质就是二进制可执行程序!!
在平时使用的windows桌面中的各种图片,是各种快捷方式,当找到这些快捷方式的文件的时候,就可以发现这些快捷方式也就是各种以.exe
后缀结尾的可执行程序。
在Linux中也一样,平时用到的指令都是在 /usr/bin
路径下的各种程序。可以利用ls -l
进行查询。
所以综上,平时使用指令既可以直接用**“快捷方式”**(eg:ll
或ls -l
),也可以使用完整的路径,调用此程序(eg:/usr/bin/ls
)。本质都是程序,使用的时候可以使用不同的调用方式进行使用。
指令的调用:
虽然说指令是一个程序,但是经过编译生成的可执行文件a.out
不一样,如果需要调用a.out
的功能需要使用相对路径,找到此文件,才可以执行运行此程序。
但是在平时使用指令的时候却不需要声明什么路径,所以也就意味着,如果将a.out
文件拷贝到 /usr/bin
路径下也可以不需要声明路径,直接调用。
完善一下上述说法:指令是特定系统路径下的二进制可执行程序。
16. which指令
语法:which [选项] 命令名
功能:which命令用于查找并显示给定命令的完整路径。它会在系统的 PATH 环境变量指定的目录中查找可执行文件,并返回找到的第一个匹配项的路径。通常用于确认正在使用的某个命令是来自哪个位置。
常用选项:
-a: 或 --all 显示所有找到的符合条件的命令路径,而不仅仅是第一个;
–skip-alias: 忽略别名,只查找可执行文件;
–skip-functions: 忽略 shell 函数,只查找可执行文件;
–read-alias: 从标准输入读取别名定义;
–read-functions: 从标准输入读取 shell 函数定义;
指令演示:
补充知识:
别名:ls -l
为什么可以和 ll
等价
①:这里使用which
指令查找ls,显示出一段话alisa ls = 'ls --color=auto'
,表示ls
是ls --color=auto
的别名,当调用ls
的时候就相当于调用了ls --color=auto
。
②:这里演示了不同调用方式的区别,在第二次调用的时候使用/usr/bin/ls
对于查询的文件没有颜色标识,再添上长选项--color=auto
即恢复正常。进一步解释了当调用ls
的时候就相当于调用了ls --color=auto
。
③:这里主要解释了alisa
的用处,其中文译为别名,所以作为程序员也可以对这里的别名ls
进行更改,此处整改为zhangsan
之后,调用zhangsan
即可实现之前调用ls
指令的效果。
回归一开始的问题,再次利用which
指令查询后得知,本质还是别名的问题:
17. mv指令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move 或 rename),经常用于备份文件或目录。
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
- 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移动至一个新的目录中。
- 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将给出的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是存在的目录名时,源文件或目录可以有多个,mv命令将会把所有源文件均移动至目标目录中。
常用选项:
- -f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i:若目标文件(destination)已经存在时,就会询问是否覆盖
指令演示:
普通文件和目录剪切方法一致,这里以普通文件的剪切为示例:
普通文件和目录重命名方法一致,这里以普通文件的重命名为示例:
并且上面两个功能可以混合使用,达成剪切到目标目录下之后还能重命名的效果:
在这里插入图片描述
18. more指令
语法: more [选项]
功能: more
命令,功能类似cat
常用选项:
- -n:指定输出行数
- q:退出more
指令演示:
调用more
指令之后,会自动显示文件内容,再文件内容填满屏幕之后便不再显示,并在左下角显示此时显示的内容占据整个文件内容百分比。如果想继续向下阅读,可以按一次回车,显示一行。
但是后续使用的时候并不推荐使用more命令,因为其只能使用回车键向下翻阅,不能使用上下键进行上下翻阅,所以很不方便。
所以在更推荐使用指令less。
19. less指令
- less 工具也是对文件或其他输出进行分页显示的工具,应该说是 linux 正统查看文件内容的工具,功能极其强大
- less 的用法比起 more 更加的有弹性,在 more 的时候,我们并没有办法前翻,只能往后看
- 但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前翻看文件,更容易用来看一个个文件的内容
- 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜
语言:less [参数] 文件
功能:less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
选项:
- -i: 忽略搜索时的大小写
- -N: 显示每行的行号
- /字符串:向下搜索 “字符串” 的功能(并高亮)
- ?字符串:向上搜索 “字符串” 的功能(并高亮)
- n:重做之前一个搜索(与/或?有关)
- N:反向重做之前一个搜索(与/或?有关)
- q:quit
20. head指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结束某个数量的文字区块,head 用来显示文件的开头至标准输出中,而 tail 想当然就是看文件的结尾。
语法:head [参数]... [文件]...
功能:head 用来显示文件的开头至标准输出中,默认head命令打印文件的开头10行。
选项:
-n <行数>
显示的行数
21. tail 指令
tail 命令从指定点开始将文件写到标准输出。使用 tail 命令的 -f 选项可以方便的查看正在改变的日志文件,tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。
语法: tail 必要参数 [文件]
功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:
-f 循环读取
-n<数字> 显示行数
补充知识:
如果在一个大文件中,指定想查阅中间2000行到2020行的这个21行信息,就需要利用到管道这个概念。
管道|
:
这里的log.txt
是一个共有一万行数据的大文件,再执行的指令head -2020 log.txt | tail -21
这个指令之后就可以显示中间2000行到2020行的这个21行信息。
这个指令的逻辑是:首先针对log.txt
这个大文件先利用指令head -2020
取出前2021行信息,并将数据结果作为输入通过管道传输给下一条指令tail -21
继续做处理,再提取出后21行信息,即可达成目标。
其中管道不仅可以叠加一层,还可以多层叠加、层层套用。
这里的管道仅有一个入口一个出口,入口就是前面第一条语句执行的结果作为输入进入管道,经过中间各种指令的处理,在最后一个指令的处理完成之后,通过出口,作为最终结果输出。
22. date指令
指定格式显示时间:date +%Y:%m:%d
用法:date [OPTION]... [+FORMAT]
-
在显示方面,使用者可以设置欲显示的格式,格式设定为一个字符后接数字格式,其中常用的标记列表示如下:
- %H:小时(00…23)
- %M:分钟(00…59)
- %S:秒(00…61)
- %X:相当于%H:%M:%S
- %d:日(01…31)
- %m:月份(01…12)
- %s:完整年份(0000…9999)
- %F:相当于%Y-%m-%d
显示常规时间:
-
在设定时间方面:
- date -s //设置当前时间,只有root权限才能设置,其他用户只能查看。
- date -s 20080523 //设置成20080523,这样会将具体时间设置成00:00:00
- date -s 01:01:01 //设置具体时间,不会对日期做更改
- date -s “01:01:01 2008-05-23” //这样可以设置全部时间
- date -s “01:01:01 20080523” //这样可以设置全部时间
- date -s “2008-05-23 01:01:01” //这样可以设置全部时间
- date -s “2008-05-23 01:01:01” //这样可以设置全部时间
-
时间戳:
- 时间戳->时间戳:date +%s
- 时间戳->日期:date -d@1508749502
- Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日 00:00:00 UTC(GMT的时区)开始经过的秒数,不考虑闰秒
显示时间戳:
时间戳转换成可视时间:
23. cal指令
cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。
命令格式:cal 参数 [年份]
功能:用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份。
常用选项:
- -3:显示系统前一个月、当前月、下一个月的日历
- -j:显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
- -y:显示当前年份的日历
指令演示:
24. find 指令
语法:find [路径] [选项]
功能:用于在文件树种查找文件,并作出相应的处理(可能访问磁盘)
常用选项
由于find的功能十分强大,所以其对应的选项也非常多,但作为初学者可以先掌握它最常用的选项,其余选项在后续学习中慢慢掌握
-name:按照文件名查找文件
指令演示:
因为find
寻找的结果最后是以绝对路径的方式呈现,可以理解为其是在Linux文件中从指令目录向下做深度优先遍历,匹配叶子结点。
补充知识:
which和find区别
find
是真的在系统目录树中查找,可以查找任意文件。which
只用来查找默认可执行程序。相当于默认在/usr/bin
路径下查找。which = find /usr/bin/ -name XXX
whereis指令:
功能:用于找到程序的源、二进制文件或者手册
在特定的路径下,查找与指定文件名近似匹配的指令或文档。
alias指令
功能:设置命令别名
alias指令设置的别名会在系统重启后失效。
25. grep指令
语法:grep [选项] 搜寻字符串 文件
功能:在文件中搜索字符串,将找到的行打印出来(行文本过滤工具)
常用选项:
- -i:忽略大小写的不同,所以大小写视为相同
- -n:顺便输出行号
- -v:反向选择,即显示没有
搜寻字符串
内容的那一行
指令演示:
同样在面对一个代码量十分庞大的项目中,如果想要阅读源代码首先就可以利用grep
指令,找到代码中的main函数的位置,开始阅读。
补充知识:
配合grep指令使用的其他命令
-
grep + wc + 管道 -> 统计符合筛选条件的行数
wc -l
:表示按行号进行计数,返回计数值 -
grep + ps + 管道 -> 寻找指定进程
26. zip指令
语法:: zip [压缩文件.zip] [目录或文件]
功能:将目录或文件压缩成zip格式
常用选项
- -r:递归处理,将指定目录下的所有文件和子目录一并处理
指令演示
如果是需要打包压缩目录或者目录下的子文件则需要使用-r选项,不带-r则用于打包压缩普通文件。
如果对目录不带-r打包压缩这只会压缩目录的顶层目录而已。
补充知识:
打包与压缩
什么是打包与压缩:
使用特定的算法,将文件进行合并或者压缩,减少体积。
实际上打包压缩是两个动作,但是可以看做是一个整体。
为什么需要打包压缩:
- 文件体积减少,节省资源。
- 压缩包在磁盘中存储,为磁盘节省空间。
- 压缩包通过网络传输,压缩包越小越节省带宽,降低网络传送的成本。
- 可以将多文件转化为一个文件,可以提高传输文件的容错性。
打包压缩的要求:
打包压缩之后进行解压解包需要保证能看到完整的文件和目录结构还要看到文件中的内容不能有缺失。
27. unzip 指令
语法:unzip [压缩文件/目录] [选项]
功能:解包并解压目录/文件
常用选项:
-d:将文件解压到指定目录下;
指令演示:
-
默认解压到当前目录
-
解压到其他路径
补充知识:
windows和Linux文件互传
要实现这个目的,首先需要了解一个工具rzsz,这个工具用于windows机器和Linux机器通过XShell传输文件,安装完毕之后可以通过拖拽的方式将文件上传上去。
yum install -y lrzsz
linux向windows传文件:
windows向Linux传文件:
28. tar 指令
语法:tar [选项] [文件/目录]
功能:将目录或文件压缩成tgz格式
常用选项
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令;
-t :查看 tarfile 里面的文件;
-z :是否同时具有 gzip 的属性?即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件,这个常用,但不建议用在背景执行过程;
-f :使用档名,需要在 f 之后要立即接档名,不要再加参数;
-C : 解压到指定目录;
指令演示:
-
压缩文件目录到当前目录下
-
压缩文件过程显示文件
-
解压文件/目录到当前路径,并在解压过程中显示文件
-
解压文件/目录到指定路径,解压过程不需要显示过程
补充知识:
- 在使用 tar 时,-f 选项需要放在最后,其余选项,比如 -c -v -z -x 可以随意调换位置
- 同样tar指令,生成的tgz压缩包也可以实现windows和Linux系统之间的文件互相传递。
29. bc指令
bc指令可以很方便的进行浮点运算。
执行基本运算:
配合管道执行计算:
**补充:**后期可以配合管道将计算放在文件中最后统一使用bc进行处理。
30. uname 指令
语法:uname [选项]
功能:uname用来获取电脑和操作系统的相关信息;同时,uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。
常用选项:
-a:详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型 (体系结构/cpu架构),硬件平台类型,操作系统名称。
-r:输出部分信息,如内核版本、硬件名、处理器型 (体系结构/cpu架构)。
指令演示:
重要到热键
-
[Tab] 按键 – 具有『命令补全』和『档案补齐』的功能
即当我们输入一个命令或者路径的一部分,然后按一次 [Tab] (有的电脑需要按两次),Linux就会自动将该命令补全。
只选项具有唯一性的时候才会自动补全,否则会将符合要求的选项都显示出来,供我们使用。
-
[Ctrl]-c 按键 – 让当前的程序『停掉』(包括终止异常程序和废除当前命令行)
终止异常程序:
废除当前命令:
-
上下键 – 翻阅历史命令
-
[Ctrl]-r 按键 – 搜索历史命令
输入 Ctrl+r,然后输入关键字系统就会弹出对应的历史指令,我们按 <- -> 即可选中
Linux允许我们这样操作说明其操作系统内部应该是将之前的指令都记录了下来可以使用指令**hsitory**进行查看。
-
关机
语法:shutdown [选项];
常见选项
- -h:将系统的服务停掉后,立即关机;
- -r:在将系统的服务停掉之后就重新启动;
- -t second:-t 后面加秒数,即『过几秒后关机』的意思;
注意:虚拟机需要关机,但云服务器永远都不要关机。
图片中部分照片参考前辈野猪佩奇