一、什么是 Linux
对于不了解 Linux 的同学来说,可能根本不懂 Linux 是什么,接下来我会简单介绍一下 Linux。大家可能对操作系统不太了解,那么我们常用的电脑中的 windows 系统大家应该听过,windows 系统和 Linux 系统都是一款操作系统。
Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了 Linux 操作系统。严格来讲,Linux 只是操作系统内核本身,但通常采用Linux内核来表达该意思。
我们只需要知道,Linux 和 windows 一样是一款操作系统,它们都是进行软硬件资源管理的软件,更多的知识我们以后学习中不断挖掘。
二、Linux 中常见的指令
1. ls 指令
语法: ls [选项][目录或文件]
功能: 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
首先我们要知道,一个文件分为内容和属性,对文件的操作,无非就分为对内容的操作和对属性的操作,而我们的 ls 指令就是对文件的配套属性进行查看的操作。
ls 指令常见的选项有以下:
- -a:列出目录下的所有文件,包括以 . 开头的隐含文件;在 Linux 中,以 .开头的文件叫做隐藏文件。使用:ls -a.
- -l: 列出文件的详细信息。其中 ls -l 可以简写为 ll. 其中选项可以组合使用,如 ls -al.
- -i 输出文件的 i 节点的索引信息。如 ls –ai 指定文件。
- -r 对目录反向排序。
- -t 以时间排序。
下面演示两个常用的指令选项,假设我创建了一个 test 目录,三个文件,分别为:test.cpp,test.c,test.txt;使用 ls 指令:
使用 ls -l 指令,即 ll :
其中文件名或目录前面的全部都是对应的属性。
2. pwd 命令
语法: pwd
功能: 显示用户当前所在的目录
使用如下:
3. cd 指令
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下。
(1) 当我们在执行 ls -la 的时候,可以看见有两个隐藏文件:
那么 .
和 ..
分别代表什么呢?
其实 .
是代表当前所在目录,..
代表上级目录,所以 cd .
就可以理解为进入当前目录,即还是在当前目录;而 cd ..
就是回退到上级目录;而在这里,假设我们需要进入 test 目录,只需要cd test
即可。
(2) 我们在进行 pwd 时,观察到会有很多的 /
符号将不同的目录分割开来,如下图,我们将它称为路径分隔符。
所以我们可以通过路径分隔符采用路径的方式找到一个文件,Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。以我们上面的目录和文件为例,如下图:
其中,/
是根目录。我们为什么要采用路径的方式找到文件呢?因为在根目录下,一定存在很多文件,而找文件,路径标识是唯一标识文件的方式。
Linux 下标识一个文件的路径方法:
- 相对路径
- 绝对路径
相对路径: 假设我们现在需要找到 test 目录,而我们当前在 code1 的目录下,相对于 code1 目录,我们需要标识 test 的路径为:../Blog/practice1/test
,即首先我们需要回退到 lmy 的目录下,然后进入 Blog 目录,再进入 practice1 目录,最后再 practice1 下标识 test。例如演示:
当前所在 code1 目录下:
我们在 cd 后跟上相对路径,即可进入 test 目录:
绝对路径: 假设我们一样需要标识 test 目录,绝对路径就是我们从根目录开始,路径为:/home/lmy/Blog/practice1/test
。
例如演示:
我当前在 / 根目录下:
在 cd 后跟上绝对路径,即可进入 test 目录:
(3) 我们在 Linux 中编写代码时,通常会生成一个可执行程序,可执行程序就是需要运行代码的程序,例如下图,a.out 就是一个可执行程序:
当我们需要运行这个可执行程序时,运行的指令是:./a.out
,例如下图:
一个可执行程序要进行,他需要加载到内存中,而在这之前,我们需要先找到它,而 ./a.out
中,/
是Linux 中的路径分隔符,我们知道,.
是当前目录的意思,而 ./
的含义就是在当前目录下找到可执行的程序。
cd 的其他命令:
- cd ~ :进入用户家目录
- cd - : 返回最近访问目录
4. touch 指令
语法: touch [选项]… 文件…
功能: touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
我们常用的 touch 命令就是创建一个文件,例如,我们要创建一个 mytest.c 文件:
5. mkdir 指令
语法: mkdir [选项] dirname…
功能: 在当前目录下创建一个名为 “dirname” 的目录
mkdir 指令就是创建目录的一个指令,例如我要创建一个 mytest 目录:
如上图,目录就创建好了。
假设我们需要递归创建多个目录,即创建一个 dir1 目录,dir1 里面又创建 dir2 目录,dir2 里面又创建 dir3 目录,这里需要加 -p 选项,加上创建目录的路径;这里需要我们引出一个指令 tree ,它是以树形结构显示指定的目录,例如:
创建递归目录:
显示递归目录:
如图,递归多个目录就创建好了。
6. rmdir 指令 && rm 指令
rmdir 和 mkdir 相反,rmdir 是删除一个空目录的指令。
但是我们日常中使用 rm 指令用作删除比较多,rm 指令可以同时删除文件或目录
当我们需要使用 rm 指令删除一个目录时,需要带 -r 选项,常用的选项如下:
- -f 即使文件属性为只读(即写保护),亦直接删除;即强制删除,删除前不会逐一询问确认
- -i 删除前逐一询问确认
- -r 删除目录及其下所有文件;有递归删除的意思
例如我们上面创建的递归多个目录 dir1 ,我们需要删除 dir1,如下:
如图,dir1 就被删除了,注意,选项可以放在最后或者放在 rm 后面都可以。
如果我们需要删除一个文件 test.cpp,就直接使用 rm test.cpp
指令就可以了。
另外,如果我们想删除当前目录下的所有文件和目录,执行的命令是 rm * -rf
,* 的含义是所有,-rf 是递归和强制。
7. man 指令
Linux 的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问 Linux 手册页的命令是:man
语法: man [选项] 命令
我们使用的时候在 man 后面跟上需要查找的命令即可。
8. cp 指令
语法: cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明:cp 指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
常用选项:
- -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在。
- -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链 接,则一律视为普通文件处理。
例如我们当前的路径下,有两个目录,一个文件:
mytest 和 test 下分别有三个文件,其树形结构如下:
我们先将 mytest.c 文件复制到 mytest 目录下,使用 cp mytest.c mytest
指令:
可以看到已经复制成功,然后我们将 test 目录以及它目录下的所有文件复制到 mytest 目录下,使用 cp -rf test mytest
指令:
如上图的树形结构,也将目录 test 复制到了 mytest 目录中。
9. mv 指令
mv 命令是 move 的缩写,可以用来移动文件或者将文件改名,是Linux系统下常用的命令,经常用来备份文件或者目录。
语法: mv [选项] 源文件或目录 目标文件或目录
功能:
- 视 mv 命令中第二个参数类型是文件还是目录,mv 命令会将文件重命名(文件)或将其移至一个新的目录(目录)中。
- 当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
例如我当前路径下有两个目录一个文件:
我们使用命令 mv mytest.c mytest.txt
观察会发生什么变化:
我们可以观察到,mytest.c 重命名为了 mytest.txt;
注意,我们使用 mv 命令时,mv src dst
假设 src 是源文件/目录,dst 是目标文件/目录,src 无论什么情况一定要存在;当 dst 是文件时,dst 一定要不存在,如果存在,src 会覆盖 dst,导致 dst 丢失。
- 当第二个参数类型是目录时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中,这里的功能即是剪切。
例如我当前路径下有两个目录,一个文件:
我们使用命令 mv test Test
观察会发生什么,注意 Test 是一个不存在的目录:
注意,这里并不是重命名的功能,而是将 test 目录剪切到 Test 目录下,因为 Test 目录不存在,所以系统会自己创建一个,并将 test 下的所有目录或文件全部剪切到 Test 中。
我们执行 mv Test mytest
命令,将 Test 剪切到 mytest 中:
我们通过 mytest 的树形结构可以看到,Test 已经被剪切到 mytest 中。
10. cat 指令
语法: cat [选项][文件]
功能: 查看目标文件的内容
常用选项:
- -b 对非空输出行编号
- -n 对输出的所有行编号
- -s 不输出多行空行
在这里,我们引入几个指令 echo
、>
、>>
、 <
;
其中,echo 是向显示器中写入字符串,例如:
而 >
、>>
分别是输出重定向和追加重定向;
>:输出重定向,本来应该写入到显示器文件中的内容,改写到指定文件中;例如我们将一段字符串写入一个文件中:
在这里我们就可以使用上面学的指令 cat,cat 就是查看目标文件的内容,使用如上;
注意如果使用输入重定向,假设写入到一个不存在的文件,系统会自动创建指定文件;而且输入重定向在每次写入到文件之前,要先清空原始文件中的内容,因为它默认以只写的方式打开文件的。
>>:追加重定向,和输出重定向的区别就是,追加重定向每次写入文件之前不会清空原始文件的内容,因为它是以追加的方式写入的,使用如下:
<:输入重定向,本来应该从键盘文件中读入数据,变成从指定文件中读取对应的数据,如下:
关于输入重定向,输出重定向和追加重定向,我们在这里只是初步认识,更多的学习我们在后面介绍。
11. more 指令
功能类似 cat,但是当我们的文件内容很多时,它每次只显示满一页的内容,按回车可以接着一行一行显示剩下没显示完的内容,按 q 退出。
由于我们接下来的一个指令功能也与它类似,但比它好用,也比它更常用,所以 more 指令不做详细介绍,我们详细介绍下一个指令。
12. less 指令
语法: less [参数] 文件
功能: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向下移动,却不能向上移动,而且 less 在查看的时候可以上下移动。
选项:
- -i 忽略搜索时的大小写
- -N 显示每行的行号
- /字符串:向下搜索“字符串”的功能
- q:quit
- less 工具也是对文件或其它输出进行分页显示的工具,应该说是 linux 正统查看文件内容的工具,功能极其强大。
- less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看。
- 但若使用了 less 时,就可以使用上下按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。
- 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
例如我们使用一个方法直接写入 1000 个"hello world" 到一个 test.txt 的文件,这个方法是在命令行直接输入cnt=0; while [ $cnt -le 1000 ]; do echo "hello world, hello $cnt"; let cnt++; done > test.txt
,例如下图:
我们只需要执行 cat 指令就能查看1000 个"hello world",而我们执行命令less -N test.txt
:
当前一个屏幕只能显示 25 个数据,我们此时按上下键是可以上下自由翻看的,按 q 就是退出查看。
13. wc 指令和 uniq 指令
在这里我们引入两个指令 wc
和 uniq
,其中 wc 它可以查看一个文件一共有多少行,有多大,使用如下:
其中,带 -l
选项就是查看行数。
uniq 就是对文件中重复的内容进行去重操作,例如现在有一个 test.c 文件,里面的内容如下:
我们对它进行去重并加上选项 -c 显示行号:
14. head 指令
语法: head [参数]… [文件]…
功能: head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
选项:
- -行数 显示的行数
例如在上面写入的1000 个 “hello world” 中,我们执行 head -20 test.txt
指令,显示从头开始的 20 行:
15. tail 指令
语法: tail [必要参数][选择参数][文件]
功能: 用于显示指定文件末尾内容,不指定行数默认显示后 10行;不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:
- -f 循环读取
- -行数 显示行数
例如继续以上面的文件为例,查看后 20 行:
现在我们可以查看头和尾了,但是如果我们要查看中间部分呢?
这里我们再引入一个知识点:管道,管道的符号是 |
。
例如我们需要查看 600~609 行,我们的思路首先需要用 head 查看到 609 行,然后我们利用前面 head 的输出作为管道的输入,然后再输出 609 行的后 10 行即可,例如以下指令:
我们在这再学一个指令 tac,tac 就是与 cat 相反,tac 是倒着查看指定文件的内容,我们使用前面所学的指令完成一个指令如下:
我们利用管道完成了一个 “流水线” ,以上的指令就是在查看的 test.txt 文件中,取出前 610 行的数据,然后再取出后 10 行的数据,最后进行倒着打印。
16. 时间相关的指令
直接使用 date
就可以查看时间,如:
我们使用指令 date +%s
可以查看时间戳,如:
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
17. cal 指令
cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。
语法: cal [参数][月份][年份]
功能: 用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份。
例如直接使用命令 cal :
使用命令查看 2023 年的日历:
18. find 指令
语法: find -options pathname
功能: 用于在文件树种查找文件,并作出相应的处理(可能访问磁盘)
常用选项:
- -name 按照文件名查找文件
例如我当前路径下的 mytest 里面有一个目录 Test,Test 目录里面有一个 file6 文件,如下图:
假设我需要找到它,却不知道它在哪里,我们可以使用指令 find -name file6
,例如:
这样我们就可以找到它的位置在哪里了。
19. grep 指令
语法: grep -选项 ‘搜寻字符串’ 文件
功能: 在文件中搜索字符串,将找到的行打印出来
常用选项:
- -i: 忽略大小写的不同,所有大小写视为相同
- -n:输出行号
- -v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行
假设我们在上面打印了 1000 个 " hello world " 的文件中查找编号有 88 的行,并显示出行号,我们可以执行 grep -n "88" test.txt
命令,例如:
如上图,前面绿色的数字就是行号,后面红色的数字就是我们需要找的字符串。
20. zip/unzip 指令
语法: zip 压缩文件.zip 目录或文件
功能: 将目录或文件压缩成 zip 格式
常用选项:
- -r 递归处理,将指定目录下的所有文件和子目录一并处理
(1)例如我当前路径下有两个目录,一个是空目录,另一个有目录也有文件,它们的树形结构图如下:
现在我需要将 mytest 目录中的所有文件和目录打包压缩到 temp 中,首先我们在 mytest 目录下进行打包压缩:
如上图,形成了一个 test.zip 文件,然后我们将这个文件移动到外面的 temp 目录下进行解压:
然后我们观察当前目录下的树形结构:
我们可以观察到,Test 原本是一个目录,它目录下的文件并没有打包压缩过来,所以是我们在打包压缩的时候出问题了。
我们在打包压缩的时候执行的命令是 zip test.zip ./*
其含义是,将当前目录下的所有文件和目录打包压缩成一个 test.zip 文件,但是并没有将 Test 目录下的文件打包压缩,所以,我们在进行打包压缩时,要加上 -r 选项,其含义是递归处理,将指定目录下的所有文件和子目录一并处理,所以正确的命令应该是 zip -r test.zip ./*
,例如下图:
打包并压缩完成:
移动 .zip 文件并解压:
最后观察是否全部已经打包过来:
我们可以看到,Test 中的文件也被打包过来了,所以这样的打包压缩才是正确的。
(2)在上面的打包压缩的时候,我们完成打包压缩后,还要将 .zip 文件先移动到指定目录再进行解压,那我们可以直接将 .zip 文件直接解压到指定目录下吗?答案是可以的,例如我们继续按照上面的例子,当前已经打包压缩好一个 .zip 文件,如图:
我们将 test.zip 文件直接解压到上级目录的 temp 目录下,执行命令 unzip test.zip -d ../temp
即可,其中,-d 是指定路径,如下图:
然后我们回到 temp 目录下观察:
我们可以看到,这样指定解压路径也是没问题的。
21. tar 指令
tar指令:打包/解包,不打开它,直接看内容。
语法: tar [-cxtzjvf] 文件与目录 …
选项:
- -c :建立一个压缩文件的参数指令(create 的意思)
- -z :是否同时具有 gzip 的属性,即是否要压缩
- -f :使用档名,注意,在 f 之后要立即接档名!不要再加选项!
- -x :解开一个压缩文件的参数指令
- -C : 解压到指定目录
- -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程
例如我们继续以上面的文件和目录为例子,我们将 mytest 目录下的所以文件和目录进行打包压缩,命令是 tar -czf test.tgz ./*
,其中 czf 的含义是以上选项的含义,形成的文件名以 .tgz 为后缀,./* 是当前路径下的所有文件和目录;
例如演示:
然后我们将它解压到上级目录下的 temp 目录,如果我们不指定目录,它默认会解压到当前目录下,例如演示:
如上图,我们用 tar 指令也完成了打包压缩和解压解包的过程。
最后,简单介绍一下 zip/unzip 和 tar 的区别,它们的区别在于压缩的算法不一样,在不同的场景使用不同的压缩算法,但是对于我们来说,使用哪一个都可以。
22. bc 指令
bc 指令其实就是 Linux 上的一个计算器,用法一般结合 echo 和管道使用,使用如下:
23. uname –r 指令
语法: uname [选项]
功能: uname用来获取电脑和操作系统的相关信息。
补充说明: uname可显示 linux 主机所用的操作系统的版本、硬件的名称等基本信息。
24. 几个重要的热键
- [Tab]按键—具有『命令补全』和『档案补齐』的功能
- [Ctrl]+c按键—让当前的程序『停掉』
- [Ctrl]+d按键—通常代表着:『键盘输入结束』的意思;另外,他也可以用来取代 exit。一般退出登录可以使用 [Ctrl]+d.
学到这里,我们的基本指令就学得差不多啦,已经够大家入门练习啦,往后更多的指令我们在后面的学习中也会介绍~ 感觉有帮助的小伙伴点个赞吧~