1.mv
作用:将文件移动、文件重命名
语法: mv (选项) 源文件/目录 目标文件/目录
(1)将文件/目录移动到当前目录的新文件/目录(也就是重命名操作)
这里我们mv了test.txt文件到当前目录下当前并不存在的ln.txt文件,这种操作就是将test重命名了
(2)将文件/目录移动到已经存在的目录下(剪切操作)
这里我们利用mv将ln文件剪切移动到了d1目录下
(3)将目录移动到已经存在的目录中,但是目录中不存在指定目录(剪切+重命名)
这里我们将dir目录先剪切到了text目录中,然后将dir重命名为d
2.cat
作用:查看目标文件的内容
语法: cat (选项) 文件
(1)将目标文件内容写入到显示器文件
我们先追加了一个new message到log文件,然后cat显示文件内容
(2)打印时添加行号显示
加一个-n就可以显示行号
(3)打印时压缩连续空行为一行
这里我们利用-s选项将原本有多行的连续空行压缩为了一行
(4)对非空输出行编号
这里是由四行空输出行和十行非空输出行构成的文件内容,我们利用-b就可以对非空输出行进行编号,而不对空行进行编号
补充:tac命令
tac是把cat命令反过来了,所以他的作用也很好记,就是将文件内容倒着输出
3.文件内容显示的其他指令
cat主要用于小文件/配置文件的打印
对于大文件(日志)我们有其他的命令负责显示,之所以不再使用cat不是因为cat不能打印,而是cat的打印会刷屏,不方便查看具体数据信息
(1)more(不方便)
语法: more (选项) 文件名
作用:分段查看大文件内容
优势:比起cat,他不会再进行刷屏,而是可以慢慢将所有文件内容显示出来
劣势:只能用回车键进行向下数据查看,无法上翻
(2)less(用于一行一行看的时候)
语法: less (选项) 文件名
作用:分段查看大文件内容
优势:比起more只能向下查看,less支持上下页面的查看,更加灵活
操作的写入位置:在less末尾的“:”后面写
操作1:q(quit:退出)
进入less查大文件内容后,如果想退出,直接按q即可
操作2:/
/主要用于查找指定内容
操作3:n
在使用/查找指定内容后,如果我们想跳转到下一个同样的内容,按一个n即可
(3)head
语法: head (选项) 文件名
作用: 用于打印从文件的开头开始的若干行信息
选项1: -n(n是任意数值)
这里我们用-1,就把log文件的第一行数据给打印出来了
(4)tail
语法: tail (选项) 文件名
作用:用于打印从文件的末尾开始的若干行信息
选项和head一样,作用改为了从倒数第n行开始输出n行
这里我们看到用tail把倒数六行数据倒着输出了
思考:如果我们想打印一段区间的数据,应该怎么做?
方法一:先用head将[0,right]的数据写入临时文件,然后从临时文件用tail读取[left,right]的区间数据
我们先将log文件的前10行输出重定向到newlog文件中,然后再打印newlog的尾部6行即可
方法二:使用管道"|"一行指令实现目标
管道的左侧为输入端,输入端进行了输出重定向,重定向数据到管道文件中
管道右侧位输出端,输出端进行了输入重定向,将数据重定向到显示器文件中
注意:如果管道有多段,前一段的输出端就相当于下一段的输入端了
4.时间相关的命令
(1)date
语法: date +(选项)
作用:以自定义格式输出时间信息
其中:
%Y:表示年 %m:表示月 %d:表示日 %H:表示时 %M:表示分 %S:表示秒
注意:中间的反斜杠\是转义字符,负责将空格转义打印到显示器上
补充:时间戳
现在显示的数字就是从1970年的午夜12点到现在所经过的秒数,而这个数字就叫时间戳,和日期不同的是,时间戳是全球同步的。
时间戳没有转化之前就是秒数
1.我们也可以将时间戳转化为日期信息
通过-d选项我们就可以把时间戳转化为具体的日期信息
2.查看北京时间的起始点
之前我们说起始点的时间是1970年1月1日的0点,但是这里却是早上八点,这是为什么?
因为地球的自转,所以地球上的不同地区被太阳照射的时间不是同步的,故不同的地区之间存在时差,这里我们把北京地区的时差加上之后,北京时间就可以同步到正确的时间戳上了。
(2)cal
语法:cal (选项)年份
作用:显示指定年份的日历
5.find
语法:find 所处目录层级(选项)文件名
作用:用于指定目录层级下开始查找文件
选项1:-name
-name的作用是让我们可以指定需要查找的文件的名字
6.nano
nano是一个用于修改文件内容的指令工具,它又叫文本编辑器。
语法:nano 文件名
修改方法:直接在内容中修改
保存修改:ctrl+o加enter
退出修改:ctrl+x
其余快捷键在底部显示
7. grep
语法:grep (选项)字符串 查找文件名
功能:在指定文件中查找目标字符串,找到后打印有目标字符串的行
(1)不带选项查找
我们先将内容重定向到test文件中,然后用grep查找指定字符,需要注意的是grep大小写敏感,所以若查找A就没有结果打印
(2)-i选项
加了-i选项后,我们的大小写就被忽略了,既可以查找大写的也可以查找小写的
(3)-v选项
加了-v选项后,我们打印出来的行就是没有指定字符串的行
比如上面,我们的查找策略就是找没有b字符的行
(4)-n选项
让输出的行带上行号
8.top
语法:top
功能:以特定频率查看系统进程和cpu占用等情况
退出方式:q
若不退出则一直运行
选项1:-d
-d可以指定我们的刷新频率
选项2:-n
-n可以指定一共刷新的次数,若刷新次数达到-n指定的次数就直接退出
9.zip与unzip
zip:压缩指令
语法:zip 压缩后文件 待压缩文件功能:将待压缩文件压缩到压缩后文件指定路径中
需要注意的是:
1.若不带任何选项,压缩的只有待压缩文件本身,无论他是目录还是文件。也就是说他是目录的话,我们压缩的就是空目录
2.带上-r选项,我们就可以对目录的全部内容进行打包压缩
unzip:解压缩指令
语法:unzip 待解压文件 解压路径功能:将文件解压到指定目录
这里我们使用unzip指令将d压缩文件解压缩到当前目录下
10.tar
(1)打包压缩
语法:tar -czvf 文件名 待压缩文件
功能:将文件压缩到某个路径
选项解释:
1.-c:表示create一个文件2.-z:表示具有gzip属性
3.-v:表示显示压缩的文件名、解压的文件名
4.-f: 表示接档名,且加了f选项,他后面不可以直接再接其他选项
补充:
文件档名:主文件名+扩展名
扩展名中用tar一般是只对文件打包(不压缩,仅仅将文件打包到一个文件中)
用tar.gz(可简写为tgz)表示对文件用gzip进行了压缩
(2)解压
语法:tar -xzvf 压缩文件名 解压缩路径
功能:将文件压缩到指定路径
注意:tar和zip是两种压缩算法,他们只能解压他们对应的压缩文件,只能压缩成他们各自的压缩文件
11.bc
语法:bc
功能:进行浮点型运算
程序不会自行结束,而是要使用quit手动终止程序
补充:
1.ctrl+c
如果我们在给键盘文件写入数据的时候写错了,想终止写入,我们可以用ctrl+c命令终止输入
2.tab
tab的作用是进行命令的补全,如果再按一次enter键就会让有相同前字符匹配的所有指令都显示出来
3.ctrl+r
ctrl+r的作用是对历史命令进行搜索,这里我们输入t进行历史命令搜索,可以发现之前写过的以t开头的命令
12.file
功能:查看更详细的文件信息
语法: file 文件名
通过file我们知道了test.c为空文件,d文件为具有粘滞位的目录文件。
13.体系结构查询指令
(1)uname
语法: uname (选项)
功能: 查找硬件体系结构
若直接查询只能查到是linux系统,用上-a选项就可以查看所有信息,此时我们就可以显示硬件体系结构
(2)lsb_release
语法:lsb_release (选项)功能:查找软件体系结构
我们需要加-a选项才能查看具体的软件体系结构配置
14.对操作系统的理解
狭义上:linux的操作系统就只特指linux的内核
广义上:linux的操作系统还包括外壳程序,甚至某些默认安装软件
图示:
(1)什么是外壳程序?
外壳程序(命令行解释器):就像shell一样,主要负责将用户输入的命令翻译给内核,并把内核的执行结果翻译返回给用户
(2)为什么需要有外壳程序?
1.为了保护操作系统:如果用户输入非法的指令,外壳程序这一层就可以直接截断下来,而不会继续传递给内核判断2.为了方便用户操作:若让用户直面内核程序,需要用户付出很高的学习成本,不利于用户上手
(3)操作系统主要通过管理软硬件来达到优化用户使用操作系统体验的目的
图示:
15.linux中的权限
1.linux的文件类型
对于windows系统,使用文件的后缀名来区分文件类型
就像这里,我们的代码会产生很多不同的文件,而windows就是根据这些文件的后缀名来区分文件类型的
对于linux系统,使用文件的属性列来区分文件类型
其中以d开头的就是目录,以-开头的就是普通文件。
虽然说linux不以文件后缀名区分文件类型,但是这并不代表我们不被允许在linux系统中使用文件后缀名,因为文件后缀名还有一个用处就是可以帮助我们快速区分文件类型
文件后缀名可能会被用于linux系统的不同工具中,在这些工具中,会以文件后缀名做区分
这里我们以gcc工具为例:
gcc是一个用于编译代码的指令工具,这里我们是使用gcc将.cpp的代码编译出来
如果我们将代码文件的后缀从.c改为其他后缀名,虽然linux系统仍然认为他是一个文件,但是gcc工具就不再认为他是一个.cpp文件,不再对它进行编译
2.linux用户
在windows系统中,我们在开机的时候可以看到有切换账号的选项,其实windows可以有多个用户账号和一个管理员账号,这就是多用户操作系统。
而linux也是多用户操作系统,其中一个root管理员账号和多个user普通用户账号
(1)linux中的用户创建与销毁
1.adduser:创建新用户
2.passwd:设置密码
3.userdel -r :销毁用户(2)将普通用户转账号为root账号(管理员才进行这个操作)
转换为root账号需要我们输入root的账号密码,输入失败会提示输入错误,输入成功就将用户转化为root,但是此时的工作路径仍然是普通用户的路径
我们输入ctrl+d就可以退出root账号回到普通用户账号
(3)将root账号转化为其他普通用户
如果我们以普通用户的身份想转换成其他普通用户身份,那么我们需要知道想转换成的普通用户的密码才可以转换,但是如果我们是root账号,可以通过su指令直接转化为任意普通用户账号。
此时的工作路径仍然是root的
(4)su - 重新登录账号
前面的su命令只会改变操作人身份,而不会改变工作路径。而su-则会直接进行重新登录的操作,不仅改变操作者身份而且改变工作路径
(5)普通用户使用sudo直接用管理员级别权限进行操作
更正:不是user/bin,而是usr/bin
这里我们需要输入的密码不是root的密码,而是普通用户自己的密码。
疑问1:为什么执行管理员权限操作不用输入root的密码?
因为有时候小组内成员需要执行管理员权限的操作,如果都交给管理员来做不现实,而如果我们将root密码交给小组内成员又会导致权责不明确的现象(root账号操作出现重大失误无法追责),所以此时我们就可以让root账号给普通账号授权,给他们进行管理员权限进行操作,这样出现问题就可以溯源了
疑问二:为什么现在我们的普通用户无法进行管理员权限的操作?
因为此时root账号还没有给lhc用户授权
授权操作:
以root的账号登录,先用nano进入配置文件,然后找到权限授予位置,添加lhc用户进入
这里我们就可以添加lhc用户到授权区域,获得和root一样的操作权限
授权后的操作演示:
由于我们前面几分钟内输入过lhc用户密码,所以此时我们就不用再重复输入,直接执行管理员权限将test.txt从/usr/bin目录中删除
3.权限的理论理解
文件权限 = 角色 + 文件属性(权限属性)
简单来说就是我们能利用某事物做一件事的前提是这个事物本身有这个功能,且我们的角色被允许做这件事
权限总的来说就是可不可以干某件事情。
接下来我们看看具体的文件属性界面
一共分七部分:
第一部分是文件的读写执行权限分布-rw-rw-r--
第二部分是文件引用计数
1
第三部分是拥有者名字
lhc
第四部分是所属组名字
lhc
第五部分是文件的大小
0
第六部分是文件创建日期
May 22 19:57
第七部分是文件名
text.txt
内容补充:
1.文件权限:rwx其中r是读的权限,w是写的权限,x是执行权限
其中x如果放开并不意味这这个文件一定可以执行,只是说我们允许这个文件执行,最终是否可以执行还是要看这个文件本身
2.职能域分类:
(1)拥有者:文件的创建者
(2)所属组:创建者所在的工作组
(3)other:除了拥有者和所属组之外的其他用户
第一部分就是控制文件权限的部分,第一个占位符位置表示文件类型,是目录还是普通文件
后面接着的三个占位符是拥有者的,然后接着三个是所属组的,最后三个占位符是other用户的。-表示没有对应权限
4.权限的操作
4.1修改文件权限属性方法一
(1)对单个角色属性的权限进行修改
指令:chmod
语法: chmod 角色+/-权限 文件名
角色:u表示拥有者,g表示所属组,o表示其他用户
权限: r/w/x(读/写/执行)
对拥有者权限进行修改
这里我们使用chmod指令给拥有者增加了文件可执行权限
对所属组权限进行修改
这里我们使用chmod给test.c的所属组权限增加了可执行
对other用户权限进行修改
这里我们使用chmod给test.c的other用户权限增加了可执行
(2)对多个角色权限进行修改
语法:chmod 角色+/-权限(多个之间用逗号隔开) 文件名
这里我们就将u,g,o的可执行权限收回了
(3)对所有角色权限进行修改
语法: chmod a+/-权限 文件名
a就是all的意思,也就是全部角色的替代。我们对a+/-权限就是对所有角色进行权限修改
注意:
1.root账号可以无视权限限制
这里我们将test.c的w权限收回,但是我们现在是root账号却仍然可以写入内容到test.c中,这说明root账号可以无视权限限制
2.角色身份只会匹配一次
这里我们的拥有者只有读的权限,所以我们进行写入的时候就会被拒绝。不过我们的lhc用户不仅是拥有者这个身份,他还是所属组的成员,而所属组是有写入权限的,为什么我们还是无法写入?
因为身份只会匹配一次,按照拥有者->所属组->other的顺序进行身份匹配,匹配成功了就不会再往后匹配了
4.2修改文件权限属性方法二
由于每个角色对应的权限rwx分别都只有两种状态,有/无,所以我们可以用二进制0/1来表示权限的状态
eg:对于拥有者,它是rw-,此时r和w是有的用1表示,x是没有的,用0表示。所以用二进制表示就是110
而如果我们都用二进制表示状态会导致我们需要用九个位置的二进制数来表示权限状态,而其实rwx最大的二进制表示就是111,也就是是转成八进制的7,所以其实我们可以用一个八进制数表示一个角色的权限,三个角色就是三个八进制数即可
eg:u:rw- g:r-- o:r--
此时我们的u就是110->6,g是100->4,o是100->4.所以最终就是644表示权限设置情况
接下来我们实际操作一次:
通过chmod 644我们确实把test.c的权限更改为了我们一开始假设的情况
4.3修改角色属性
1.更改拥有者
指令:chown
语法:chown 修改成的用户名 文件名
功能:将对应文件的拥有者改为其他用户
这里我们试图将test.c文件传递给root账号,但是这被拒绝了,因为普通用户没有转角色属性的权限。
疑问:为什么设计的时候不给普通用户修改角色属性的权限?
因为这涉及到分工责任,如果员工a写烂了一个代码文件,该文件导致公司服务器瘫痪,此时员工a若把文件的拥有者转给员工b,那么此时员工b就应该要为这件事负责,员工a就把黑锅甩给了员工b
root账号/权限允许进行角色转换:
(1)root账号条件下进行转换
这里我们用root账号将test.c的拥有者从root改为了lhc
(2)root权限下进行转换
这里我们用sudo来提权,将文件的拥有者改为了root
2.更改所属组
指令:chgrp
语法:chgrp 修改成的用户名 文件名
功能:将对应文件的所属组改为其他用户
这里我们将test.c的所属组从lhc改为了root
4.4目录权限
r:决定是否执行用户要的查看文件的命令
w:决定用户是否可以修改文件名,新建/删除执行目录下的文件
x:是否可以进入目录
所以我们的目录创建好之后默认带上的权限就是都有x的。
普通文件默认权限:666
目录文件默认权限:777
疑问:那么我们真正创建文件/目录的时候为什么不是根据这个默认权限生成的?
因为我们还需要对默认权限进一步操作,将权限掩码的拥有部分除去,而权限掩码是用来增强默认生成的灵活性的,特殊情况下我们可能需要创建一堆特定权限要求的文件,所以我们用原来的默认权限和权限掩码组合使用就可以达到目的权限掩码的作用:可以将权限掩码中出现的权限从默认权限中过滤掉,从而得到最终权限
权限掩码查看指令:umask
第一位可以先不看,后面三位就是权限的八进制表示
过滤方法:默认权限 & (~umask)
eg:
我们通过对umask取反然后再与默认权限按位与的计算方法就可以将权限掩码的权限从默认权限中过滤掉
修改umask的方法:
语法: umask 要改成的权限
这里我们就将权限掩码改为了007
对目录的w权限的理解:
一个文件本身是否可被读,写,执行,取决于他的文件权限。而他是否可以被删除和修改文件名取决于他所处的目录是否有w权限。
一般来说,普通用户的目录都不允许其他用户进入,也就是说普通用户的目录只有用户自己和root可以进入
假设现在我们想实现多个用户共享一个文件,我们可以怎么做?
首先我们一定不能把该目录文件创建在任何一个普通用户的家目录下,因为普通用户的家目录只有root和用户本身可以进入,无法实现共享功能。
1.利用root创建一个shared目录文件,并把other权限的w和x打开,从而其他普通用户都可以进入shared目录进行文件操作。
2.此时虽然可以进行文件共享,但是可能会出现错误删除或恶意删除的情况,所有用户都有对目录下文件的新建和删除权限。
3.此时我们可以使用粘滞位来限制普通用户的删除权限
粘滞位:当我们给目录设置了粘滞位后,只有该文件的拥有者/root/目录拥有者可以删除该文件,其他用户无权删除。
演示粘滞位设置:
粘滞位设置后x就被替换为了t,此时就可以限制普通用户的删除权限了