本期我们开始学习Linux,首先我们来学习Linux的常见指令
目录
操作系统是什么
Linux下基本指令
1.ls指令
2.pwd指令
3.cd指令
4.touch指令
5.mkdir指令
6.rmdir指令 && rm 指令
7.man指令
8.cp指令
9.mv指令
10.cat指令
11.more指令
12.less指令
13.head指令
14.tail指令
操作系统是什么
首先我们要知道操作系统是什么?
操作系统是一款做软硬件管理的软件,一般我们计算机最底层的结构叫做硬件,比如cpu,内存,鼠标,显示器等等,早期的计算机是通过硬件电路直接控制的,所以当时需要用户手动的去控制硬件,后来随着硬件的发展,硬件的功能越来越完善,所以就需要一款软件来对硬件进行管理,这个软件就称为操作系统,但是因为要管理的硬件变得复杂了,比如磁盘接口,各种接口,包括键盘鼠标等等,所以在操作系统和硬件直接需要多一个东西,叫做设备驱动,我们的电脑,如果使用的是有线鼠标的话,在我们刚插上接口的时刻,我们移动鼠标,电脑上的指针是不会立刻动起来的,而是过两三秒,在显示器右下角会弹出一个驱动安装成功,鼠标才能动起来,这说明我们在插鼠标时,操作系统已经加载了,我们的硬件和鼠标已经链接好了,但为什么不能移动呢?因为少了一个设备驱动,设备驱动的核心工作就是做驱动相关的工作
我们举个例子,操作系统的主要任务是做各种管理和决策,硬件就是办事的,设备驱动是让硬件去办事的,比如我们在公司里,有程序员,有老板,有项目经理,程序员的工作是由项目经理指派的,而项目经理让我们做这些事,是因为老板要让我们做这些事,老板做完决策后,就交给项目经理,然后项目经理就让我们做这些事情,整个公司就像一个树状的结构,所以老板就是操作系统,项目经理就是设备区别,而程序员就是硬件,老板为什么要我们做这些事情呢?比如让我们制作A产品,B产品等等,这些产品最后是给用户使用,所以应用软件就是用户
我们的操作系统,设备驱动,硬件就为我们提供了软硬件服务,但我们用户使用电脑又不是为了使用操作系统,而是为了看电影,玩游戏,使用浏览器在网上冲浪等等,用户是有各种各样不同的需求的,所以在不同的场景下,在操作系统之上,就诞生了不同的应用软件,满足用户的不同需求
知道了什么是操作系统,那一个好的操作系统衡量指标是什么?为什么要有操作系统呢?
比如我们喜欢玩游戏,如果这个游戏三分钟一卡顿,五分钟一掉线,再比如,一个电脑上的文件可以被陌生人随意的窃取,修改,没用做好管理,这些操作系统都不是一个好的操作系统,所以一个好的操作系统,对于用户,要稳定,快速,安全,这是我们普通人看操作系统的重要指标,操作系统的核心工作是通过对下管理好软硬件资源的手段,达到对上提供良好的操作环境,这个良好是形容词,就是稳定,快速,安全,换句话说,如果没用操作系统,我们就无法对软硬件进行管理,这也是为什么要有操作系统的原因
现在我们要理解计算机上的操作,比如我们学习C语言时用printf向显示器打印,使用文件操作向磁盘文件写入,我们玩游戏时会向网络发送数据,我们在计算机上的所有行为,都会转化为硬件行为。
那这些行为是直接通过软件到硬件的吗?当然不是,而是自顶向下,贯穿计算机的软硬件结构,从应用软件,到操作系统,再到设备驱动,最后才到硬件,所以我们所有的软件行为,都和操作系统直接或者间接相关,比如各位今天浏览这篇博客时,我在写这篇博客时,都是一样的
有了这些知识,我们正式进入本期内容
我使用的是云服务器,centos7.6,使用Xshell来进行完成操作,没用配置的同学网上搜一下如何安装即可
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 一行只输出一个文件。
(因为我们是刚接触Linux,所以我先简单讲几条指令,详细内容下面会讲)
当我们登录后,我们有什么呢?所以我们第一件事是查看我们当前目录下有什么
我这里有一个之前创建的test.c文件,如果各位是刚使用的话,就可能什么也没有,总之,ls就是显示当前目录下文件列表,我上面的test.c,或者还有一些其他的东西,这些东西都叫做文件
当前目录,那什么是当前目录?我们连自己在哪都不知道,所以就有了下面的指令
2.pwd指令
语法 : pwd功能 :显示用户当前所在的目录常用选项 :无
大家可能看到的和我不一样,我这里使用的是root账号,如果是普通用户,看到的就是/home/XXX
我们举个例子,比如我打开了我的电脑,打开了C盘,随便打开一个文件
我并不清楚我在哪个文件下,而Windows下我们可以直接看到
这叫做我当前所处的Windows路径,这就等价于我们pwd看到的路径
那如果我们想建一个目录该怎么办?这就相当于我们在Windows下建立一个文件夹
在Windows下我们鼠标右键,然后选择新建文件夹就可以
那Linux下呢?
我们使用的就是mkdir指令
此时我们就建好了,前面的mkdir是指令,后面的hello是文件夹,二者中间有空格,可以有很多空间,但建议用一个就行,在Linux下,这个文件夹叫做目录
我们在Windows下建立文件夹可以立即看到,在Linux下,我们要使用刚才学的ls指令
这个蓝色的就是我们创建的目录
在Windows下我们建立的文件夹,我们双击就可以进入,那Linux下呢?
3.cd指令
语法 :cd 目录名功能 :改变工作目录。将当前工作目录改变到指定的目录下。举例:cd .. : 返回上级目录cd /home/litao/linux/ : 绝对路径cd ../day02/ : 相对路径cd ~ :进入用户家目cd - :返回最近访问目录
如何证明我们进去了呢?很简单,使用pwd即可
这个操作就等价我们在Windows下的双击
简单说完这几条指令,我们回过头来再仔细学习上面的指令,指令是可以携带选项的
比如我们的ls,我们这里就携带了-l
我们再看看-a,这也显示出来的和直接用ls不一样
上面多了这些文件是因为我多创建了一些文件用于演示,touch相等于我们新建文本文件
ls -l会显示出更多的属性
在Windows下的指令也是可以携带选项的
比如我们可能用过的
-s关机,-t设置120秒
我们先看一个问题,我们创建了一个文本文件,里面什么也没用写入,这个文件需要占内存吗?
答案是要占用内存
这个文件有文件名,文件的创建时间等等的文件属性,文件的属性是数据吗?
答案是属性是数据,既然是数据,就需要被存储
所以,文件=文件内容+文件属性
文件的操作=对文件内容的操作 或者 对文件属性的操作
此时我们回过头来看ls -l,它的本质就是显示文件属性,l就是list的意思
ls -l是可以被简写为 ll 的
这两条命令是等价的,下面我们来看-a
使用-a后我们看到,多了一个点和两个点的文件
我们先不看这两个,在Linux中,我们可以跟多个选项
后面的选项也可以简写为-la
写成-al也是一样的,根据自己的喜好写就行
我们显示了这么的内容,其中第一列的第一个字母
叫做文件的类型,比如是文本文件等等,这里面以d开头的,表示它是一个目录,以-开头的,表示这个文件是一个普通文件,其他种类我们之后再说
我们来看一个点和两个点,以点开头的我们叫做隐藏文件,如果我们有什么东西不想让别人看到我们就可以用点开头,-a是显示所有文件,包括隐藏文件
在Windows下也是有隐藏文件的
那一个点和两个点是什么呢?
我们先进入dir1中,然后用ls会发现什么也没有
如果此时我们携带了-a就会出现一个点和两个点
所以我们有一个结论,在Linux下任意一个目录都有一个点和两个点的隐藏文件
我们先pwd显示路径,然后cd两个点
我们发现我们回到了hello的文件里,我们继续cd两个点
我们最终来到了一个 / 的位置,我们就明白了两个点是当前路径的上级路径,表示回退
这就相当于我们在Windows下的回退
接下来我们来看一个点,一个点表示的是当前路径
我们这里是有一个test.txt的,如果我们在里面写入代码(下面的操作以后会讲解,大家先看一个点的作用就行)
里面就已经有了我们写好的代码
我们将.txt改为.c ,然后我们用gcc编译会生成a.out的文件
-开头说明它是普通文件,但这是一个可执行程序
我们可以用 ./a.out来运行它
一个点的作用就是告诉操作系统我们在当前目录下,比如这里我们就是要执行当前路径下的test.c
一个点的存在意义就是帮助我们用户定位当前目录下的文件
ls除了-a,-l还有很多选项,我们先回到上级目录,然后用ls -al来看我们的hello目录
它会显示出目录里面的东西,如果我们不想看里面的东西,而是想看这个目录本身该怎么办?
我们就可以使用-d选项
我们再携带一个l让内容详细一点,-d的作用就是将目录像文件一样显示
我们再次回到hello里面
这次我们用ls再带一个F,F就是以可视化的形式显示,我们就发现后面多了/或者*,,“*”表示可执行的普通文件,“/”表示目录
上面就是我们对ls的介绍,这些都是我们常用的,大家可以看看上面更多的选项,自己尝试一下
下面我们来看看pwd和cd
我们不断cd ..,最终会来到 / 的位置,这个/叫做根目录
这个里面第二个/,即root和hello中间的/,叫做路径分割符
而Windows下用\表示路径分割符
我们下面来证明它是根目录
我们用ls查看它,我们不想看它里面的,就用d选项,这里再带上l
我们看到这是以d开头的,说明它是一个文件
目录里面是可以放目录和文件的,我们可以多次嵌套,最终会让Linux的整个目录变成一个多叉树的结构,是树结构,就有根节点,我们来看Linux的目录结构
这棵多叉树的叶子一定是空目录,或者是非目录文件,而路上的节点,一定是一个非空目录
所以我们所有对文件或者目录的增删查改,本质都是对这棵多叉树的增删查改
所以我们定位一个文件,通常用路径进行定位
比如这里的路径
我们使用路径定位是因为它具有唯一性
为什么我们可以找到想要的文件呢?因为一个节点可能会有多个子节点,但一定只有一个父节点,所以我们从文件开始回退,一定可以回到根节点,我们把从根目录开始定位到指定位置,具有唯一性的路径,叫做绝对路径
所以我们可以直接用绝对路径来进入目录
除了绝对路径,还有相对路径
此时我在std-oct_22,我可以回退两次来到代码存放
然后从代码存放这里进入java代码,再进入day1目录
比如我们上面的多叉树里,假设我们在bin目录,lib目录下有一个test.txt
我们就可以 ../lib/test.txt
我们以自己当前所处路径作为起始参照位置,来进行特定文件的定位,这种路径就是相对路径
如果有一天我们自己的路径变化了,比如我们从bin下跑到了passwd下面,这种方式就找不到test.txt了,我所处路径发生变化,相对路径就肯可能失效,但绝对路径一定可以找到
那我们用哪个比较好呢?绝对路径放哪里都不会错,看起来很好,但是绝对路径一般比较长,一般在固定场景下使用,比如配置文件,而相对路径其实比较少,一般命令行输入,比较常用相对路径
我们再看一个东西
我们进入腾讯网,随便点进去一篇文章,这些文章其实都是文本文件,是有浏览器做渲染的,这些不是重点,我们看到上面蓝色的链接,是有 / 的,这是路径分割符,这是Linux风格的,说明腾讯的后端使用的就是Linux
基本所有的操作系统目录都是树状结构,我们Windows等等都是
下面我们来看cd的一些操作
我们先回到root目录下,whoami是我是谁的意思,查看当前登录用户是谁,我们刚登录上来,就在这个位置,这个root叫做root用户的家目录
如果我们使用普通用户登录
在Linux下用户分类只有两类,一类是超级用户,即root,超级管理员,另一类就是其他,即普通用户,在centos下,所有普通用户,用户账号都会放在/home下,这些用户是使用adduser创建的(我们自己创建),我们也可以userdel -r 用户名,来删除普通用户,对于root用户来说,家目录在根目录下,而普通用户在/home下
那Windows下有家目录吗?答案是有的
我们再看桌面,桌面的本质就是一个文件夹,当我们登录对应的用户时,就有对应的文件,Windows也是可以创建多个用户的,同样的,Windows也是有超级管理员的
比如我们右键一个应用,就有以管理员身份运行这个选项
当我们知道什么是家目录后,我们就可以来看下面的内容了
cd ~,可以让对应用户直接进入到家目录
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 使用指定的日期时间,而非现在的时间
touch是触摸的意思,但touch的核心工作是创建一个普通文件,注意,不能创建目录
比如这里我们就创建了test.txt和test.bin ,我们发现他们都是-开头的
5.mkdir指令
语法 : mkdir [ 选项 ] dirname...功能 :在当前目录下创建一个名为 “dirname” 的目录常用选项 :-p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在 , 加上此选项后 , 系统将自动建立好那些尚不存在的目录, 即一次可以建立多个目录 ;
mkdir是创建一个目录
那如果我们想要创建一批目录,一串路径,比如
我们想这样操作,创建d1,然后在d1里创建d2,在d2里创建d3,但是这样写太麻烦了
所以我们可以tree一下
让目录以树状结构显示
tree .显示当前目录开始,显示树状结构
如果大家是刚开始学习Linux,这里是使用不了tree的,因为没用安装
输入yum install -y tree即可
另外,安装的时候是需要root用户的
如果我们想创建一串路径,是不能这样操作的
如果我们想这样操作,需要加上-p
我们上面创建了这么多文件,但是我们都是用不到的,我们该怎么删除它们呢?
6.rmdir指令 && rm 指令
rmdir 是一个与 mkdir 相对应的命令。 mkdir 是建立目录,而 rmdir 是删除命令。语法 : rmdir [-p][dirName]适用对象 :具有当前目录操作权限的所有使用者功能 :删除空目录常用选项 :-p 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。rm 命令可以同时删除文件或目录语法 : rm [-f-i-r-v][dirName/dir]适用对象 :所有使用者功能 :删除文件或目录常用选项 :-f 即使文件属性为只读 ( 即写保护 ) ,亦直接删除-i 删除前逐一询问确认-r 删除目录及其下所有文件
我们先看rmdir,这是删除空目录的意思
我们发现,dir1就没了 ,说明删除了,我们发现dd1,dd2,dd3这些里面有内容,我们rmdir一下
是无法删除的
所以我们就要介绍rm指令
当我们删除test.bin时,因为我们是超级用户,所以删除是会有提醒的,输入y是确认,n是否定,如果是普通用户,是没用提醒的
注意,Linux下删除就真的删除了,Windows下是有回收站的,Linux下想恢复成本太高了,所以大家删除前要想清楚
刚才我们删除的时候它有提示,如果我们确认想删,但是提示太烦了怎么办?这时就可以带上-f
我们这里用rm删除dir2看看
发现是不能删除的,因为rm不能删除目录,但是我们非要删除呢?可以带上-r选项
这是因为目录是递归式定义的,-r是表示递归
我们用-r来删除dd1,发现太烦了,这么多要确认 ,这是先递归进入,然后删除,以防节点断裂,不过这不是重点,重点是我们要确认这么多次,太烦了,如果中间不小心输了n,那就全白费了,所以我们可以输入-f,来让它不要问我了
-rf表示递归并强制删除,最后,我们删的时候要想慎重,对于初学者来说,就等于无法恢复
如果我们是管理员时不小心rm -rf /,那可就不得了了,我们就把操作系统删掉了,不要做这种尝试,如果做了的话,那就只能重装系统了
在Linux中有一个通配符 *
我们来看例子
我们先创建一些文件,* 可以匹配任意类型文件
我们可以直接ls *
它就会把这些文件都显示出来,当然我们一般不这样用,而是下面这种方式
ls *.c 就可以显示出所有以.c结尾,前面的内容是任意的,所以叫做任意匹配
我们还可以ls test.*
就会把所有test.开头的文件匹配出来
所以我们想要删除所有文件时可以rm * -rf
rm删除文件可以 rm -rf 文件名,也可以 rm 文件名 -rf
我们推荐使用第一种
-i选项会在你删除时进行提示 (不过我们当前是root账号,加不加都会提示)
如果是普通用户,删除时如果不加 -i 就会直接删除,不会进行询问
7.man指令
Linux 的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问 Linux 手册页的命令是man 语法 : man [ 选项 ] 命令常用选项-k 根据关键字搜索联机帮助num 只在第 num 章节找-a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用 a 选项,当按下 q 退出,他会继续往后面搜索,直到所有章节都搜索完毕。解释一下 , 面手册分为 8 章1 是普通的命令2 是系统调用 , 如 open,write 之类的 ( 通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)3 是库函数 , 如 printf,fread4 是特殊文件 , 也就是 /dev 下的各种设备文件5 是指文件的格式 , 比如 passwd, 就会说明这个文件中各个字段的含义6 是给游戏留的 , 由各个游戏自己定义7 是附件还有一些变量 , 比如向 environ 这种全局变量在这里就有说明8 是系统管理用的命令 , 这些命令只能由 root 使用 , 如 ifconfifig
在Linux中,因为Linux是使用C语言写的,所以很多接口都是C的,另外,我们学了这么多指令,之后还有更多,有些指令我们不知道它的用法,所以我们可以通过man手册进行查看
比如我们查看ls指令
我们直接man ls
再比如我们刚学习的rm,使用man rm查看rm指令
我们先看man man
我们重点来看下面的1~7,这是手册的编号,比如1号手册,就是用来查询基本指令的,2号手册
是查询接口,系统调的,3号手册是C语言,后面这些我们不关心,重点是前两个
我们先 man printf
printf除了是我们C语言的函数外,它还是Linux的一条指令,Linux竟然也支持printf,我们来使用看看
printf是可以按照我们的要求来输出的,这个printf指令和我们C语言的printf是没有关系的
如果我们想看C语言中的printf,我们应该查3号手册,man 3 printf
如果大家在这里查询时出现:no manual entry for xxx,说明配置不齐,输入 yum install -y man-pages 即可
我们继续看上面的问题,这里显示出了很多printf,未来我们都会使用
我们打开man手册后,想要下翻,可以按回车,也可以按上下键进行翻动,如果想退出就按q
我们再随便查一个2号手册的
我们再来说一下man的查询机制,当我们直接man 想要搜索的,没有加手册编号的话,它会按手册1号开始查找,1号没有就查找2号,直至全部查询完,如果没有找到,就告诉你不存在,如果我们加上手册编号的话就会去对应编号手册查找
我们在日常中经常会用ctrl cv进行一系列的复制粘贴,那Linux下怎么实现呢?
我们先看下面的问题
我们这里有一个文件test.txt文件,它的里面是空的
这里我们用echo指令,echo指令会将后面跟的内容显示出来
当我们在后面加上大于号,再跟上文件
这是现在文件的大小
这是刚才文件的大小
我们在跟上大于号和文件后,发生了一些现象,第一,hello Linux并没有像第一次一样在显示器上显示出来,第二,hello Linux被写入到了test.txt中,我们来看看是不是真的写了进去
我们使用了cat指令,cat就会将文件内容打印出来
上面的两种现象和我们使用了大于号加文件名,我们这里引入一个概念叫做:输出重定向
我们用通俗的说法来解释就是本来应该打印到显示器上的内容打印到了文件里
这些我们后面都会讲,我们现在做这些事情是为了让文件有内容,然后我们才好进行拷贝
所以下面就有了新的指令
8.cp指令
语法 : cp [ 选项 ] 源文件或目录 目标文件或目录功能 : 复制文件或目录说明 : cp 指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息常用选项 :-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在-i 或 --interactive 覆盖文件之前先询问用户-r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理-R 或 --recursive 递归处理,将指定目录下的文件及子目录一并处理
我们使用cp指令,将test.txt拷贝到test_copy.txt里
然后我们用ll指令发现真的多了一个文件,并且大小和test.txt一样,我们继续使用cat指令来查看内容,发现确实是一样的,说明我们拷贝成功了
这是直接拷贝到了当前路径,我们在同一个目录下,我们拷贝文件必须两个文件的名字不一样
如果我们想拷贝到上级路径话可以这样做
后面是相对路径,使用绝对路径也可以
我们来看看是否拷贝成功
我们看到,拷贝成功了
如果我们想要拷贝d1这个目录,目录下面还有子目录,我们想要拷贝一批目录
如果我们直接拷贝是不可以的
我们要携带-r选项
我们发现拷贝成功,目录内部是一样的
-i选项是拷贝时提示是否覆盖原内容,第一次没询问是因为刚开始我们还没有test2.txt这个文件
加上-f是不会询问,但是我们测试发现,还是会进行询问的
这里的原因是因为我此时是root账号,如果是普通用户就不会询问了
我们递归拷贝时,不想被询问 -rf 即可
我们在创建文件时,可能没想好起什么名字,就搁置了,之后是可以进行重命名的
那在Linux下怎么重命名呢?
9.mv指令
mv 命令是 move 的缩写,可以用来移动文件或者将文件改名( move (rename) fifiles ),是 Linux 系统下常用的命令,经常用来备份文件或者目录。语法 : mv [ 选项 ] 源文件或目录 目标文件或目录功能 :1. 视 mv 命令中第二个参数类型的不同(是目标文件还是目标目录), mv 命令将文件重命名或将其移至一个新的目录中。2. 当第二个参数类型是文件时, mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个, mv 命令将各参数指定的源文件均移至目标目录中。常用选项 :-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖
这样我们就将test2.txt 重命名为 mytest.txt了
除了重命名,mv还有一个功能,叫做剪切
拷贝是将文件复制一份,而剪切是将文件拿走了
我们再将它拿回来
我们从上级目录 ../ 里找到文件 mytest.txt ,将他剪切到当前目录 . 里面
我们再看一个操作
这个操作是剪切并重命名
那么,什么时候是重命名,什么时候是剪切呢?
如果我们mv后面跟着文件,后面只跟了一个目录,没有跟新的文件名,那这就是剪切
如果目录后面还跟了一个名字,这就是剪切并重命名
如果我们这样写就是重命名,这个写法等价于
意思就是在当前目录下剪切并重命名
我们可以认为,所有的mv操作都是剪切并重命名,只不过当我们不指定新名字时就会默认使用当前的名字
对目录重命名和剪切同理
我们再来补充一个东西,ctrl C
在Windows下,ctrl+C是复制的意思,在Linux下是终止因为程序或者指令异常,而导致我们无法进行指令输入
我们可能写了很长一串命令然后因为某种原因而不想写了,但是删除太麻烦了,我们就可以用ctrl+C来结束该行
或者我们因为某些原因导致进入死循环等等,都可以用ctrl+C来进行终止
由于我们的Linux没用Windows下那样的回收站,所以我们可以试着写一个垃圾桶来代替,这个垃圾桶就是一个目录
然后我们只需让rm test.c转化为mv test.c 垃圾桶即可
将 rm 改造成 mvvim ~/.bashrc # 修改这个文件mkdir -p ~/.trashalias rm=trashalias ur=undelfileundelfile() {mv -i ~/.trash/\$@ ./}trash() {mv $@ ~/.trash/}
不过因为这些内容我们目前还没学习,这些我们先不做尝试,等我们学习完基本工具再回过头来完成这个操作
我们上面说过,ls -l 就等价于 ll ,如何证明呢?我们这里先提出两个问题,我们该如何看待指令?我们在执行指令之前,我们应该先做什么
我们这里创建一个123.c的文件,在它里面写入hello Linux,然后编译运行
我们刚刚写的是源代码,我们运行就可以直接跑起来
再看我们的指令,ls,mv,touch等等指令,指令也是可以运行的
所以,指令就是可执行程序
如果我们随便输入一些东西,这里就会说没有找到指令
这里就透露一个出一个细节,当我们执行指令时,系统要先去寻找指令,找到就会执行
所以指令一定在系统中的某一个位置,我们来看指令在哪里
指令在usr的bin目录下
我们可以看到这里有非常多的指令
指令在系统中特定的路径下存在的,这些指令一定是某种可执程序(比如是C/C++/python)
所以我们就可以把我们自己的程序用mv指令给我们自己的程序(比如垃圾桶)取一个名字,然后拷贝到这个目录下,我们就可以向执行指令一样执行我们自己的程序,这种操作就叫做安装软件
到时候我们的程序就不用带路径,直接输名字就可以使用,和我们使用指令一样
但是一般不推荐将自己写的放入到这里,因为用的时间久了可能分不清自己的指令和系统的指令
我们也可以用rm从这里将指令删除,这个操作就是卸载
我们的Windows下桌面上的快捷方式双击可以直接打开,当然我们也可以找到它的文件所在,找到对应的exe文件也可以打开,这和Linux下是一样的,所以指令就是可执行程序,写好后放在一个目录下,就像我们平时一堆游戏或者学习资料将他们集中到一个文件夹里一样,Linux和Windows是没有区别的
我们回过头来看这个问题,查询ls是可以找到的,但ll是不存在的
我们可以用which查看指令的位置
我们看到查询ll时,前面有一个alias,ll = ‘ ls -l 然后是配色方案
就是我们给指令做了重命名,就比如我们现实里朋友的名字里有生僻字,我们可能就会给他取一个外号,方便我们平时叫他
比如我们就可以
这样我们就可以直接使用mycmd,就等于我们输入后面那么长的指令了
如果我们不想继续用这个重命名了,可以这样做
这里同样不推荐将系统的指令重命名,不然我们可能会分不清
我们这里再说一点知识
Linux下一切皆文件,我们认为Linux下一切东西都是文件,比如显示器,键盘,普通文件等等
比如键盘相当于从键盘这个文件里读取数据,显示器相当于向显示器这个文件里写入数据
我们之前用 echo "hello Linux",我们现在就要理解为我们把这句话写到显示器文件中
echo "hello Linux" > test.txt,就是把这句话写入到了test.txt中,这叫做输出重定向
这里可能有人分不清echo和cat,说一下他们的区别,echo后面跟的是字符串,不论我们输入什么,他都会原封不动打印出来
而cat后面跟的是文件,是显示出文件的内容
我们接着往下说
我们这里不断用echo向test.txt里写入,但最后用cat指令打印时发现只有一行
当我们再换一句时,发现之前的全没了,输出重定向有一个特点,向目标文件写入时,是覆盖写入的
即他每次会做两个工作,第一步是先清空文件,第二步是写入新内容
当我们使用两个>时就可以追加内容,这两个>是连续的,中间没有空格,这个行为叫做追加重定向
我们用cat后边什么也没跟,我们输入什么它就输出什么,即默认从键盘读取,向显示器打印
如果后面跟个小于符号,那么就变成了本来应该从键盘文件读取,现在不用从键盘读取,而是从指定文件读取,这个现象就是输入重定向
当我们知道输入重定向后,我们来看下一个指令
10.cat指令
语法 : cat [ 选项 ][ 文件 ]功能 : 查看目标文件的内容常用选项 :-b 对非空输出行编号-n 对输出的所有行编号-s 不输出多行空行
我们直接使用cat,后面不跟<也是可以打印出来的,不过跟不跟还是有区别的,我们后续会进行讲解
我们上面讲了三大重定向,输入重定向,输出重定向和追加重定向
我们创建文件不一定需要使用touch,,使用>也可以进行创建
我们继续来看cat指令
我们可以携带-n选项,会显示出行数
我们先向文件里加入多行空行
然后我们用cat打印时也会将这些空行打印出来
如果此时我们加上-n ,会将空行也加上行号
如果使用-b就不会给空行加行号
还可以使用-s选项,将多行空行压缩为一行
同样,这些选项一块使用更舒服
11.more指令
语法 : more [ 选项 ][ 文件 ]功能 : more 命令,功能类似 cat常用选项 :-n 对输出的所有行编号q 退出 more
我们使用这条语句生成1w行的hello Linux 行号(这里的知识后续会讲解)
行号从1到1w
然后我们把这么多文本重定向到test.txt里
我们此时可以看到test.txt非常大
如果我们想看前1000行,使用cat查看,我们翻到头也翻不到那里,所以cat不适合看大文本
cat适合看小文本,或者代码片段
而如果我们使用more查看的话,就可以查看到文件开始的位置
此时我们按回车这个文本就可以向下翻页,想要退出按q
我们可以携带-n选项,这里的n是数字
这样就可以直接跳转到500行
不过大家这里按上下键翻页的话,会发现只能向下翻页而不能向上
我们在翻页时输入/字符,是可以进行搜索的,中间的skipping是跳过的意思
因为more的一些缺点,我们更推荐使用下面的指令
12.less指令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是 linux 正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜语法: less [ 参数 ] 文件功能 :less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。选项 :-i 忽略搜索时的大小写-N 显示每行的行号/ 字符串:向下搜索 “ 字符串 ” 的功能? 字符串:向上搜索 “ 字符串 ” 的功能n :重复前一个搜索(与 / 或 ? 有关)N :反向重复前一个搜索(与 / 或 ? 有关)q:quit
我们输入
我们同样可以用回车向下翻动
我们用上下键也可以翻页,less是可以上翻的
less也可以用/ (和more一样)进行搜索
同样,退出都是q
我们未来在查看大文本或者日志时就可以使用less或者more进行查看
13.head指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块, head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。语法: head [ 参数 ]... [ 文件 ]...功能 :head 用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。选项 :-n< 行数 > 显示的行数
如果我们想简单看一下文本的前几行内容,就可以使用head
它默认会显示10行
我们也可以用-n选项来显示,想看多少行就看多少行
14.tail指令
tail 命令从指定点开始将文件写到标准输出 . 使用 tail 命令的 -f 选项可以方便的查阅正在改变的日志文件 ,tail - f fifilename会把 fifilename 里最尾部的内容显示在屏幕上 , 并且不但刷新 , 使你看到最新的文件内容 .语法: tail[ 必要参数 ][ 选择参数 ][ 文件 ]功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。选项:-f 循环读取-n< 行数 > 显示行数
有head就有tail,tail就是显示最后几行
同样是默认10行
同样可以用-n选项
如果我们不想看头,不想看尾,想看从1000行开始到1020行怎么看呢?使用head和tail,并且把文本截取出来
我们可以先
此时就有了到1020行的内容
我们可以把这段内容重定向到temp文件里
然后我们使用tail,就可以截取到我们想要的内容了
上面的操作虽然可以完成我们想要的结果,但是这个操作过程中创建了一个临时文件,有没有办法不创建临时文件就可以完成这个操作呢?
所以我们要补充一个知识,叫做管道
上面指令中有 | ,它链接了两侧指令,这个我们就叫做管道文件,这个符号在C语言里我们叫做按位或
下面我们来谈谈管道
这个管道是一个符号,但是会被系统解释为管道文件
这个文件不会在磁盘中存在,是在内存级的
作用是将左侧程序的输出交给管道文件,然后让右侧程序从管道文件中读到自己的程序中
什么叫做管道呢?我们生活中有下水管道,运输管道(如天然气,石油,自来水等等)
管道有入口和出口,管道的作用是传输资源
计算机里也是如此,将左边程序的数据传输给右边程序,数据就是我们的资源
我们下面再举一个例子
我们有一个文件,我们在访问这个文件时,计算机是直接从磁盘里读写文件呢?还是把文件先加载到内存里读取,修改完再写回去呢?
答案是先加载到内存,我们在学习C语言阶段说过,我们的程序要运行起来,必须在运行之前先加载到内存里面
所以我们所有的文件在某个阶段都会是内存文件,只不过我们的磁盘文件最后要将文件再写到磁盘,而管道不需要,仅此而已
那管道怎么用呢?
比如我们可以用cat显示文件,然后交给head,只打印20行
我们再交给tail,拿到后边的10行
我们还可以再统计一下行数(wc -l 是统计行数)
管道可以多条指令链接,就像流水线一样
以上即为本期全部内容,因为Linux指令还是挺多的,所以我把内容分为多期进行讲解
希望大家可以有所收获
如有错误,还请指正