小白记录Linux学习历程(更新中)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

学学吧,可能有用!


一、linux的安装(省略)

二、在终端登录linux

1.当前身份提示

由于管理员root的权力比较大,为了防止一不小心的命令输入就可能造成系统崩溃,我们应当时时在意执行命令的用户是谁:
(1)通过结尾的$与#即可区分开一般用户和管理员用户
(2)通过[ ]内@前的用户名可以直接得知用户名
建议提前拍快照,否者万一在root身份下一不小心的命令输入就可能造成系统崩溃,恭喜你:重装系统吧!
代码如下(示例):

[erdeng@study~]$      结尾时$表示是非管理员用户
[root@study~]#        结尾时#表示是管理员用户

2.开始执行命令

代码如下(示例):

[用户名@study~]$ command  [-option] parameter1  parameter2...
                  命令       选项      参数          参数

啊!啥玩意又是命令又是选项,还有参数1,还参数2,甚至参数…
举个例子:女朋友说:“ 学习 linux, 男朋友”。
(1)这就符合 [用户名@study~]$ command [-option] parameter1 parameter2…格式,命令谁发出来的:女朋友。则女朋友就是相当于用户
(2)作用者:男朋友,男朋友执行了命令,男朋友相当于参数。嘻嘻,男朋友万一 被绿了,这个命令可能发个多个男朋友,那就有多个参数了。但是但是但是,重点来了,无论多少男朋友都是该女生的男朋友,那么也就是说参数一定是用户拥有的,参数一定是属于这个用户的。由于linux是有许多文件和目录组成的复杂系统,咱们可以暂时理解为参数这个文件或文件夹一定属于用户这个大文件夹。
(3)命令:学习,这个很容易理解
(4)选项:Linux,女朋友让男朋友学习同时给他限制了内容,学的必须是Linux。选项我们可以理解是对于命令的修饰限定,明确的说明执行的方式,比如:ls:一个用于列出目录内容的常用命令。对于它的选项有-a ,加上-a,即可显示所有文件和目录,包括 . 开头的隐藏文件。在默认状态下不显示。文件为啥隐藏呢?
大概率是为了安全与整洁考虑。

参数一定要有吗?
当然不是啊!也不是所有人都有对象的,哈哈哈。linux中ls后就可以不写,cd后就要有,为啥呢?我也说不明白,咱们继续学吧。

三.基础命令操作

特殊点记住记住记住,date命令添加选择用 “+”

1.date

当我们输入date,点击“Enter”执行命令,以默认的时间格式输出时间。

erdeng@erdeng-virtual-machine:/root$  date                                      
20240709日 星期二 10:24:12 CST

我们也可以通过自己想要的格式去输出时间,年、月、日、时、分对应%Y、%m、%d、%H、%M,这简单就是英语单词的首字母。注意月是小写m,分是大写M。linux是严格区分命令、选择、参数的大小写的。

erdeng@erdeng-virtual-machine:/root$ date +%Y/%m/%d 
2024/07/09

2024/07/09中的 / 是我们自己设置的格式,你也可以换成#、&等等,只要你喜欢。

erdeng@erdeng-virtual-machine:/root$ date +%H:%M
10:43

你也可以尝试date +%Y/%d/%M这种年/日/分的方式输出,当然实际中应该没有这么抽象的时间输出方式。现在是2024年9号48分,抽象的时间输出方式,也就是告诉你输出时间的格式很自由不要忘记 + ,在 + 后随意组合吧。

erdeng@erdeng-virtual-machine:/root$ date +%Y/%d/%M
2024/09/48         

date加号(+)开头的参数可指定日期命令的格式字符串

erdeng@erdeng-virtual-machine:~$ date +%R
13:26
erdeng@erdeng-virtual-machine:~$ date +%x
20240715

2.cal

注意点:显示某年某月时[month] [year],月在前年在后。
公历中的格式通常按照/月/日/年 或 日/月/年,无论哪种月都在年前面。
(1)cal的linux命令格式:cal [month] [year] (中括号表示内容可选)
(2)cal的作用:展示日历,cal默认的输出就是当前所在月的日历。注:默认在此处指不加任何中括号的修饰。
此时是2024年7月9号,在此处默认展示就是2024年的7月的日历。

erdeng@erdeng-virtual-machine:~$ cal
      七月 2024         
日 一 二 三 四 五 六  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30 31 

当我们想要查看2022年3月,输入cal 2022 3即可

erdeng@erdeng-virtual-machine:~$ cal 3 2022
      三月 2022         
日 一 二 三 四 五 六  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        
                  

当然cal可以查年历,输入:cal 年份 ,输出一整年的日历

erdeng@erdeng-virtual-machine:~$ cal 2024

你可以查看到2024一整年的日历,当前日的背景被标记为白色背景做提示。
(3)一年有12个月,我想查看2024年13月的日历行吗?

erdeng@erdeng-virtual-machine:~$ cal 13 2024
cal: 13 is neither a month number (1..12) nor a name

当然不行了,你把计算机当傻子了,还是把linux当傻子了。月份必须是1-12。年份也只能是正的,这个为啥呢?应为公历是从公元1年开始记的。啊哈哈哈,扯远了,继续学!!!!

3.bc

记忆点:+:加,-:减,(✳):乘,/ :除,^:指数,%:余数(这太基础了,都知道吧)
注意点:除 ,scale的使用
对于计算器的使用非常简单,它不具有任何的选择,一个 bc 命令即可进入计算器模式。进入计算器模式就可以将它看作时一个会计算的草稿纸,要算啥就把式子直接写上去。求1加2 ,就直接输入1+2 。求2乘3,就直接输入2*3。

erdeng@erdeng-virtual-machine:~$ bc
bc 1.07.1     <==这是计算机版本
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006,2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.  <==前面一堆都在说啥版权啥的,但你只要看到这句就是说可以用计算器了
1+2   <==输入1+2 ,“Enter”
3     <==1+2的结果
2*3   <==输入2*3,“Enter”
6     <==2*3的结果

只要是学过任何一门编程语言的都知道,再计算里面要注意的就是 除法,这不用多解释吧!

erdeng@erdeng-virtual-machine:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1/3           <=13,咱们脑子是0.33333.....,但计算机接收到是进行整除
0             <=0.33333......对结果取整数,整数部分是0,也就取01.99/1        
1             <=做了一次1.99/1的命令,得到1,多做这一步就是为了告诉你,这是单纯的只取整数,不是四舍五入。

那我们就这么"任由"除法这么"缺斤短两"吗? ==> 小数部分多少都不显示,反了他了。
我们得给除法设一个scale,scale的中文有标度、刻度的意思。那咋用呢?我们进入到计算器页面后:

scale=3        <==以scale=n的形式显示小数点后n位
1/3
.333           <==0.333 ,整数0省略
20/3
6.666

完蛋,在计算器页面出不去了。咋搞呢?这很简单直接输入 quit ,别忘记点击“Enter”。跳出计算器,继续敲别的吧!!!!!

四.热键

热键是热键,快捷键是快捷键。我暂时没做特别区分,用就完了!

1.[Tab]

(1)命令补全
linux中命令众多,我们可以通过[Tab]键的补全功能来起到提醒作用,避免命令或文件名打错。我们在前面学习了cal命令,我们此时输入ca+[ Tab]可见下面输出很多以 ca 开头的命令。其中就可以找到cal,对照着打出来就降低了错误率。有人要说了cal 谁不会,哈哈哈,那特别长的你也都能记住吗?你说你能,那就确实厉害!!

erdeng@erdeng-virtual-machine:~$ ca
cal                calibrate_ppa      canberra-gtk-play  capsh              case            catchsegv          cautious-launcher  
calendar           caller             cancel             captoinfo          cat                

(2)文件补齐
文件与命令不同,文件存在对应的文件夹下。假设现在要查看erdeng用户的根目录下的以.bash开头的文件
ls:文件与目录的查看命令 -al: -a 与 -l 两个选择的结合,-a显示隐藏文件 (以 . 为开头的文件 )

erdeng@erdeng-virtual-machine:~$ ls  -a   ~/.bash   <==此处点击[Tab]
.bash_history  .bash_logout   .bashrc               <==查看到该文件夹下的.bash开头的所有文件

命令补全:命令往往都是第一个字段,那么命令补全也就是在第一个字段后点击 [Tab]
文件补齐:我们查看文件名,我们需要在文件对应的文件夹中查看,所以需要一个查看的命令字段。要是以特定的格式查看还需要一个选择的字段。文件所属文件夹的路径又是一个字段,所以文件的补齐是在多个字段后,输入文件的开头后按[Tab]补齐。简单的区分于命令补齐就是文件补齐的[Tab]是多字段后的[Tab]。

2.[Ctrl] -c 组合键

首先声明[Ctrl] -c是同时按[Ctrl]键和c键组成的组合键,这和Windows的复制的快捷键是同样的操作方式。但在linux系统,它的作用是终止当前进程。通俗的说就是执行某命令后,一直运行一堆东西。当你按下[Ctrl] -c 后,进程终止。
该组合键会终止正在运行中的进程,如果你在进行下载啊,更新啊…重要的命令时最好别乱按,按了就终止了!!!

3.[Ctrl] -d 组合键

[Ctrl] -d 按键也是一个组合键
相当于exit命令,注销用户。注销可以理解为当前登录的用户账号从系统中登出或退出,已结束当前会话。你在虚拟机自己的终端中按该组合键终端页面会瞬间消失,在远程连接的shell上按该按键,远程设备瞬间断开连接。通俗的说就是[Ctrl] -d 按键关闭命令输入的页面,无法继续输入,除非重新打开终端或远程设备重新连接。

4.[shift ]+[PgUp]或[PgDn]

[shift ]+[PgUp]或[PgDn]也是一个组合键用于翻页。有人此时疑惑了:“linux终端里的命令都是从上到下那么多条,我都用鼠标滚轮上下滚动的,我也没看到它咋分页,像现实中翻书那样翻页啊!”。那我就问你了,咱用滚轮的时候眼不花吗?你能确定你刚好用滚轮滚到你最后看到的那一行的下一行吗?此时,咱们将你所看到的命令行页面的第一句到最后一句视为页面1。当我们按[shift ]+[PgDn]这个组合键后,此时页面是为页面2,你会发现页面2的内容刚好是页面1的最后一句。这就证明了[shift ]+[PgUp]或[PgDn]的翻页作用。[shift ]+[PgUp]和[shift ]+[PgDn]一个向上一页翻。,一个往下一页翻。
建议输入 find 命令,因为它会展现很多命令。然后验证练习[shift ]+[PgUp]或[PgDn]
该组合键。

erdeng@erdeng-virtual-machine:~$ find

5.错误提醒

错误提醒还是挺重要的,有助于我们及时修改自己的错误。
(一) 拼写类错误
(1)纯粹拼错
(2)大小写错误 ==>linux区分大小写。
(二) 命令不存在
命令不存在,往往第一句:Bash:… <=错误提醒。第二句会给你提供安装的命令,按照它的提醒安装即可。
(三) 路径问题
路径问题我们可以通过查看路径的方式去经行相应问题的具体解决。文件我们后期会大量学习相关的致使先别急。

linux学习就是大胆的练,大胆的试。大不了重新安装虚拟机。

五.关机

学了那么久了,也知道咋区分用户与管理员了,也知道一条命令操作的格式了,还学了几个基础的命令,热键也学了几个。今天不学了,那你直接就走了吗?你还忘了一步——关机。linux不正常关机可能会造成文件的损坏,那看了必须学怎么正确关机了。啊啊啊啊!继续干!!!
我原本还以为第一个要学习的命令是 ls :展示命令,没想到是关机的shutdown。

1.关机命令–shutdown

前面我们讲解过命令的完整格式:

  [用户名@study~]$ command  [-option] parameter1  parameter2...
                   命令        选项      参数1        参数2

对于关机,我们可以想到立刻关和等一会儿关机,这两种方式也就对应两个选项,因为选项是对命令的修饰嘛,选项把原本的关机修饰成立刻的关机还是一儿的关机。

shutdown的选项:
-r     <==在后面设定重新开机时间,shutdown -r 30 ==>30分钟后重新开机。
-h     <==在后面设定关机时间,默认是1分钟。啥是默认?默认就是不在后面设定,单单执行 shutdown -h

当你执行了一会儿关机,你突然发现你女朋友给你发消息了!嘿,你别说,她就是这么巧。咋办呢?等它关机再开机太慢了。这不能在关机了,咋办?赶快来一个取消关机。

-c     <==取消shutdown -h  [时间]这个命令的关机

当然关机除了以上的三种使用,还有一个非真关机,而是在吓唬你玩

-k   <=假关机,逗你玩

原本我疑惑啥真关机假关机?到底关不关?还是那就话:敲!大不了重装虚拟机。

root@erdeng-virtual-machine:~# shutdown -k now 'shutdown now'  <==立刻关也不关
root@erdeng-virtual-machine:~# shutdown -k 1 'I will shutdown after 1 mins' <==等一分钟后看看关不关,’‘里面是提示语句。
Shutdown scheduled for Wed 2024-07-10 09:20:57 CST, use 'shutdown -c' to cancel.<==提醒了,等了八分钟都没关,看来是真不关!!!

到现在我不知道 -k 会在什么时候用到,存在就有意义吧,咱继续学!!!
为了防止你感觉乱,我们看一下shutdown命令的标准格式:

root@erdeng-virtual-machine:~# shutdown [-krch] [时间] [警告信息]

(1)选择就不用多解释了吧
(2)-k和-h的时间可以直接输入数字,多少就是对应多少分钟后执行。时间也可以是 now 立刻关机

2.shutdown实操

(1)将用户身份切换到root
(2)在关机前我们最好进行 sync 命令的执行,sync将内存中尚未被更新的数据写入硬盘。
你可能疑惑为啥要切换成root?因为root下执行 sync 可以将所有数据写,一般用户只能写入自己的数据到硬盘。(root权力大)

erdeng@erdeng-virtual-machine:~$ su -   <==切换到root用户,su切换用户命令回头还会细说,现在知道是切换就行。
密码: 
root@erdeng-virtual-machine:~# sync     <==将所有数据写到硬盘
root@erdeng-virtual-machine:~# shutdown -h +10      <==命令的意义
Shutdown scheduled for Wed 2024-07-10 08:46:14 CST, use 'shutdown -c' to cancel.<==执行命令时间是836+10表示10分钟后执行,语句提醒会在846分执行关机,
root@erdeng-virtual-machine:~# shutdown -c    <==取消关机,还能继续学,不能关!!!

那你就是强迫症,我说在root用户下关机,你偏要试试普通用户。哎,偷偷告诉你,我也偷偷的试了,哈哈哈。
普通用户下的关机
(1)在远程连接设备上:

erdeng@erdeng-virtual-machine:~$ shutdown -h +10
Failed to set wall message, ignoring: Interactive authentication required.
Failed to call ScheduleShutdown in logind, no action will be taken: Interactive authentication required.<==巴拉巴拉一大堆,看到开头的Failed就知道失败了。

可见在远程设备上一般用户不能执行关机。
(2)在虚拟机终端上:

erdeng@erdeng-virtual-machine:~/桌面$ shutdown -h +10
Shutdown scheduled for Wed 2024-07-10 09:15:28 CST, use 'shutdown -c' to cancel.
erdeng@erdeng-virtual-machine:~/桌面$ shutdown -c

可见在虚拟机终端上一般用户可以执行关机。

3.其他相关命令

 halt      <==系统停止,屏幕保留一部分信息                    
 poweroff  <==立刻关机
 reboot    <==立刻重启
 suspend   <==进入休眠

对于这几些命令相同功能的选择一个即可,对于除halt以外的命令大家肯定一看就明白啥功能。对于halt的啥保留信息啥的,你可以去试试,你就明白了。我感觉就是比一般的关机高级一点的(步骤多一点),哈哈哈。
你可以通过命令 man halt 查看halt的所有选项和功能,以后对于命令的选项遗忘时,我们可以通过 man 查看,退出查看页面点击 q 即可退出,关机相关的操作就不再赘述了。会关机了吧!再见!

六.文件与目录

1.文件所属

一个文件对应三个用户,拥有者、同组用户、其他用户。啊!什么一个文件,三个用户的。
看了鸟哥的linux的基础学习篇里面举的例子,我看了有种恍然大悟的感觉,我来引用一下:

在这里插入图片描述

看图,我们先看左侧的王家。当别人问王家有谁的时候,我们看图可知王家有王大毛,王二毛,王三毛。我们为什么这样回答呢?而不是把张小猪也算进来?那是因为我们无意识间将王家当作了一个组,王家三兄弟都是组内成员。张小猪是张家组里面的,相对于王家组里的任何一个组员都是其他用户。同组用户和其他用户懂了吧!
情况一:王家的客厅对每个王家人都是公开的,但是王三毛的情书只属于王三毛自己,王三毛是情书的拥有者。突然有一天三毛准备公开给家人自己的恋情,便将情书放在了王家客厅,那么王家人都看到王三毛的情书。但是张小猪作为张家人在不认识张家任何人的情况下是不可能进入张家看到这封情书的。巧了,张小猪认识张家一个人那么他可以进入张家客厅看到这份情书。
情况二:王三毛和张小猪是无话不说的好基友,单身多年的三毛终于恋爱了,一激动将自己的情书都发给了张小柱,但是害怕家人知道他早恋并未告诉家人。
我描述的情况一和二就是让你知道,用户组的权限不一定就大于其他组用户。他们之间不存在权限大小关系。
那拥有者、用户组,其他用户的权限都是那来的?咋去看文件的权限呢?不要急,咱们先学习查看权限,在学修改权限。

2.ls 命令

首先我们执行如下命令:

erdeng@erdeng-virtual-machine:~$ ls -al
总用量 185384
drwxr-xr-x 16 erdeng erdeng      4096 710 13:11 .
drwxr-xr-x  3 root   root        4096 75 18:39 ..
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 公共的
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 模板
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 视频
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 图片
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 文档
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 下载
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 音乐
drwxr-xr-x  2 erdeng erdeng      4096 75 18:45 桌面
-rw-------  1 erdeng erdeng      1241 710 10:51 .bash_history
-rw-r--r--  1 erdeng erdeng       220 75 18:39 .bash_logout
-rw-r--r--  1 erdeng erdeng      3771 75 18:39 .bashrc
drwx------ 14 erdeng erdeng      4096 78 16:14 .cache
drwx------ 11 erdeng erdeng      4096 76 00:26 .config
drwx------  3 erdeng erdeng      4096 78 16:13 .gnupg
-rw-rw-r--  1 erdeng erdeng 189736377 19  2018 jdk-8u151-linux-x64.tar.gz
-rw-------  1 erdeng erdeng        28 710 10:29 .lesshst
drwxr-xr-x  3 erdeng erdeng      4096 75 18:45 .local
drwx------  4 erdeng erdeng      4096 75 18:57 .mozilla
-rw-r--r--  1 erdeng erdeng       807 75 18:39 .profile
drwx------  2 erdeng erdeng      4096 75 18:54 .ssh
-rw-r--r--  1 erdeng erdeng         0 75 18:46 .sudo_as_admin_successful
-rw-------  1 erdeng erdeng       272 710 13:11 .Xauthority

1.ls默认状态的查看

咦!执行一个短短的 ls -al 出来那么一大堆。我倒要看看 ls 这个查看命令是怎么个事!!!
ls命令执行的格式

erdeng@erdeng-virtual-machine:~$ ls [选项与参数] [文件名或目录名]

现在我们去看看 ls 默认的查询结果

erdeng@erdeng-virtual-machine:~$ ls
公共的  模板  视频  图片  文档  下载  音乐  桌面  jdk-8u151-linux-x64.tar.gz

这查的是哪个文件呢?
当然就是erdeng用户的文件了,但是听说linux系统看作是一棵由文件构成的大树, / 表示的是根目录,其他文件在根目录下“开枝散叶”的。那我们也可以通过完整的路径来查看问用户erdeng的文件和目录,用户存在 / 目录下的/home 中。所以执行完整路径查看用户erdeng的信息执行以下命令:

erdeng@erdeng-virtual-machine:~$ ls /home/erdeng
公共的  模板  视频  图片  文档  下载  音乐  桌面  jdk-8u151-linux-x64.tar.gz

与 ls 的默认查看结果一样,所以现在知道 ls 的默认查看的原理了吧!
至于我咋知道用户就存在于/home下,这在后面会讲的,现在知道 ls 默认查看就可以了,不要急。

2. 文件或目录的路径问题

文件路径错误一:
ls 查看时文件夹的路径一定不能错,出现文件路径拼写类的错误,这种太低级的错误不在说了。

erdeng@erdeng-virtual-machine:~$ ls / <==查看根目录下的文件
bin  boot  cdrom  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var
erdeng@erdeng-virtual-machine:~$ ls /lib  <==深入查看lib
accountsservice        gcc                                   linux                 pm-utils                   sysusers.d
apg                    gdm3                                  linux-boot-probes     policykit-1                tc
apparmor               ghostscript                           linux-sound-base      pppd                       terminfo
apt                    girepository-1.0                      locale                pulse-13.99.1              thunderbird
输出目录部分省略.....
erdeng@erdeng-virtual-machine:~$ ls /lib/gcc  <==进一步深入到gcc
x86_64-linux-gnu

正确的找的了x86_64-linux-gnu目录,
文件路径错误二:
在无任何干系的目录下查找,前面我们已经知道在默认状态下的查看就是对当前用户的子文件和子目录的查看,用户erdeng里无x86_64-linux-gnu,他们貌似就没啥关系。这种查看就是完全乱查。

erdeng@erdeng-virtual-machine:~$ ls x86_64-linux-gnu <==直接在用户erdeng下查看/x86_64-linux-gnu
ls: 无法访问 'x86_64-linux-gnu': 没有那个文件或目录

文件路径错误三:
文件路径不能跳

erdeng@erdeng-virtual-machine:~$ ls /x86_64-linux-gnu  <==直接在 / 目录下查看/x86_64-linux-gnu
ls: 无法访问 '/x86_64-linux-gnu': 没有那个文件或目录

对于文件名必须是层层递进不可跳层,我个人理解是有两个原因:
(1)上层目录下面有好多目录,路径不明确,不知道下一步往哪走。
(2)同级目录下的子文件或目录有同名的,跳层无法确定具体所指文件。
所有的命令在执行文件或目录相关操作是都有该方面的要求。
这三类错误我们都可以使用文件补齐的热键 [Tab] 来减少错误发生,不信你try try。

3.ls 参数选择

知道 ls 命令怎么查了,也知道怎么查自己想查的文件了—正确的路径。好家伙,不错了!但是任有美中不足之处,哪不足呢?ls 是查看,查看查看,会查了,是不是也得“好看”。用参数去调整输出模式,是输出更便于观看。
ls 命令比较多,学几个常用的。其他的可以在日后慢慢积累,一下背太多,也会忘地快。

-a :全部文件包括.开头的隐藏文件
-l :详细信息显示,包含文件的权限和属性等数据
-d :仅列出目录本身,而不列出目录内的文件数据
-R :连同子目录内容一起列出来,将该目录下所有文件都显示出来。

当我们去查询根目录下的etc文件,这个简单:

erdeng@erdeng-virtual-machine:~$ ls /etc
acpi                           crontab              groff            legal           network                  rc3.d              sysctl.d
adduser.conf                   cron.weekly          group            libao.conf      networkd-dispatcher      rc4.d              systemd
alsa                           cups                 group-    

但是听说有一些文件为了简洁或安全考虑,它们被隐藏,以 .的形式开头。这种文件在查看的时候要多加一个 -a 的选项。上下两图对比发现加了 -a 选项的命令输出的结果果然多了几个 . 开头的目录。

erdeng@erdeng-virtual-machine:~$ ls -a /etc <==展示隐藏文件名
.                              cron.hourly          glvnd            ld.so.conf      nanorc                   rc0.d              sudoers
..                             cron.monthly         gnome            ld.so.conf.d    netplan                  rc1.d              sudoers.d
acpi                           crontab              groff 

-l :详细信息显示,包含文件的权限和属性等数据,这对我们的文件来说非常重要

erdeng@erdeng-virtual-machine:~$ ls -l /etc
总用量 1120
drwxr-xr-x  3 root root    4096 316  2023 acpi  <==权限和属性等数据
-rw-r--r--  1 root root    3028 316  2023 adduser.conf

那我们即想要显示隐藏文件又想要显示文件的权限和属性等数据咋办呢?好办,直接 -al 作为选择。

erdeng@erdeng-virtual-machine:~$ ls -al /etc
总用量 1136
drwxr-xr-x 131 root root   12288 78 18:04 .   <==隐藏加权限和属性等数据
drwxr-xr-x  20 root root    4096 75 18:38 ..
drwxr-xr-x   3 root root    4096 316  2023 acpi
-rw-r--r--   1 root root    3028 316  2023 adduser.conf

选项的组合使用没有输入的顺序之分,-al 还是 -la 都可以。
单单执行一个 ls -d [目录或文件],你可能会疑惑ls -d 貌似没啥用,展示自己的目录。

erdeng@erdeng-virtual-machine:~$ ls -d /etc
/etc           <==我让你查它,你给我输出它!!!

那现在有一个问题,就是你怎么查看当前目录本身的权限。噢噢噢噢, -d 瞬间又被我爱上了。 -d 与-l 组合==> -dl

erdeng@erdeng-virtual-machine:~$ ls -dl /etc
drwxr-xr-x 131 root root 12288 78 18:04 /etc ==>当前 /etc目录自己的权限、属性以及一些数据

通过使用 -R选项,连同子文件目录内容一起列出,该目录所有文件都显示出来。但是没有命令tree的显示更加直观。

root@erdeng-virtual-machine:~# ls -R /home/
/home/:
aaa  erdeng

/home/aaa:

/home/erdeng:
公共的  模板  视频  图片  文档  下载  音乐  桌面  jdk-8u151-linux-x64.tar.gz

/home/erdeng/公共的:

/home/erdeng/模板:

/home/erdeng/视频:

/home/erdeng/图片:

/home/erdeng/文档:

/home/erdeng/下载:

/home/erdeng/音乐:

/home/erdeng/桌面:
root@erdeng-virtual-machine:~# tree /home
/home
├── aaa
└── erdeng
    ├── 公共的
    ├── 模板
    ├── 视频
    ├── 图片
    ├── 文档
    ├── 下载
    ├── 音乐
    ├── 桌面
    └── jdk-8u151-linux-x64.tar.gz

10 directories, 1 file

3.文件

我们进行ls -l 的查询时会得到:

drwxr-xr-x   5 root root    4096 316  2023 vulkan <==这种格式的输出

咦!存在就有意义,都有什么意义呢?

1.文件类型

开头第一个字符 ,第一个字符可以看出文件类型,是目录、文件、链接文件还是别的。
[d]则是文件,文件主要存储的是普通数据,这些数据一般是以字符串或其他数据形式存在,用于表示文本、图像、音频、视频等多种类型的信息。
[-]则是目录,一种特殊的结构化数据,即目录文件下所有文件名索引的映射关系。这种映射用于记录和管理目录内文件的组织和结构。
[|] 则是链接文件。
[b]则表示为设备文件里面的可供存储的周边设备,硬盘、存储设备、光盘、其他存储设备。
[c]则表示设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)。
常见的也就是 d 、- 其次是 |

2.文件权限

1.权限与所属关系

我们暂时所接触到的权限就三种 r (读) w (写)x(执行),哈哈哈,看到这句话脑瓜子嗡嗡的。不要怕,先学这三个。
文件的属性和所属有三可改:
(1)权限修改,拥有者、同组用户、其他用户对这文件能怎么处理,之前给他能的权力现在看来大了或小了都得去修改。
(2)拥有者修改,拥有者是文件所属的用户。这也好理解,我的零食送你了。我送之前零食的拥有者是我,现在给你了给不是把零食的用户者改了。
(3)同组用户和拥有者的理解方式相同。
有一些可爱的同学现在可能疑惑?咦!为什么不修改其他用户呢?哈哈哈,不要太可爱,除了拥有者和同组用户都是其他用户,你说咋改。将拥有者和同组用户改了,其他用户也就跟着改了,自己理解吧!
先知道这些可以改,具体怎么改,我觉得看完权限的意义可能会有一个更深的理解。

2.权限的意义

紧贴在第一字符后面的便是一连串的9个字符串。文件开始学习时,我们就提及了文件的拥有者、用户组、其他用户。这个字符也就是对应三个用户的权力 r w x==>读 写 执行,当 r w x 被 - 取代,则表示不具备该权利,读写执行的顺序不可变。
对于文件和目录有相同的权限,但不一定可执行相同的功能

-rwxr-xr--     ==>第一个字符是  - , 可见这是文件的权限
  • 拥有者的权限是 r w x ,具有可读可写可执行的权力
  • 同用户组用户权限是 r - x,具有可读可执行的权力
  • 其他用户权限是 r - - ,仅具有读的权力
drwxr-xr--     ==>第一个字符是d , 可见这是目录的权限
  • 拥有者的权限是 r w x ,具有可读可写可执行的权力
  • 同用户组用户权限是 r - x,具有可读可执行的权力
  • 其他用户权限是 r - -,但是它不具有可读的功能。对于目录文件必须有可执行的 x 权限才能进入目录。不具备该目录的 x 权限也就不能切换到该目录下,也就是不能进行读写操作,权限是r w - 也等价于 - - - 。

难点来了!!!
开放目录给任何人浏览时,为什么至少给予 r 、x ,而 w 不是随便给的。
参照鸟哥linux的例子,我就是看这个举例搞明白的。
这是其他用户对于文件的 r - - 权限的状态的目录的执行情况。

erdeng@erdeng-virtual-machine:~$ su -
密码: 
root@erdeng-virtual-machine:~# cd /tmp            <==切换到工作目录/tmp下
root@erdeng-virtual-machine:/tmp# mkdir testing   <==/tmp文件下创建新的目录(mkdir创建目录,后续会讲)
root@erdeng-virtual-machine:/tmp# chmod 744 testing  <==修改目录的权限
root@erdeng-virtual-machine:/tmp# touch testing/testing  <==在目录下创建文件(touch创建文件后续会讲)
root@erdeng-virtual-machine:/tmp# chmod 600 testing/testing <==修改文件权限
root@erdeng-virtual-machine:/tmp# ls -ald testing testing/testing <==显示目录与文件的权限
drwxr--r-- 2 root root 4096 710 23:29 testing 
-rw------- 1 root root    0 710 23:29 testing/testing
root@erdeng-virtual-machine:/tmp# su erdeng  <==切换到一般用户,相对与 /tmp 是其他用户。文件夹的其他用户的权限是 r - -  
erdeng@erdeng-virtual-machine:/tmp$ ls -l testing <==查看testing目录
ls: 无法访问 'testing/testing': 权限不够
总用量 0
-????????? ? ? ? ?             ? testing  <==就是因为不具有 x (执行的权限),只有 r (读)的权限,所以虽然显示了内容文件,但是前面一大堆  ?
erdeng@erdeng-virtual-machine:/tmp$ cd testing/    <==切换到 testing/ 目录下,用于其他用户对 testing目录无 x (执行操作),所以无法切换。
bash: cd: testing/: 权限不够

如果该目录属于用户本身,会是什么状态?

erdeng@erdeng-virtual-machine:/tmp$ su - <==切换到root,管理员身份
密码: 
root@erdeng-virtual-machine:~# chown erdeng /tmp/testing  <==切换目录的拥有者为erdeng
root@erdeng-virtual-machine:~# ls -ld /tmp/testing   <==查看切换后testing目录的权限和属性
drwxr--r-- 2 erdeng root 4096 710 23:29 /tmp/testing 
root@erdeng-virtual-machine:~# su erdeng <==切换到用户erdeng
erdeng@erdeng-virtual-machine:/root$ cd /tmp/testing <==erdeng作为testing目录的拥有者,而且权限是rwx,所以肯定可以进入目录,并对目录内的文件与目录经行添加和删除操作。
erdeng@erdeng-virtual-machine:/tmp/testing$ ls -l
总用量 0
-rw------- 1 root root 0 710 23:29 testing <==有人可能疑惑,这目录的拥有者都是erdeng了怎么它里面的文件的拥有者却是root。

那我问你一个问题,你考虑一下,你书包里放的一定是你的东西吗?假设你书包里放的是你同学的情书,当你见到你同学的时候你把他情书从书包里拿出来,就相当于删除。他又给了你一封回信,传给他女朋友,这时你的书包里有多了一封信,这就相当于添加。所以可见添加与删除的操作都在于你自己的判断。虽然情书在你书包里放着,但是情书的拥有者不是你,你只是一个其他用户。对于他们的情书你是不能打开(相当于权限 x),所以对于对于里面多甜蜜的内容你都看不到,也不可能编辑。懂了吧,testing这个目录的拥有者是erdeng,但它所包含但目录和文件不一定是自己的。

erdeng@erdeng-virtual-machine:/tmp/testing$  rm testing
rm:是否删除有写保护的普通空文件 'testing'

上面的例子看懂了,你就懂这个为什么可以删了。

3.链接数

权限后面有一个数字,暂时我还没学到,将来会了再回来补…

4.权限修改

当你看到权限修改的时候,你是不是就会想到两方面的问题。
(1)谁有权力改?
(2)有权力改,我要咋改?

1.谁能改?

无非就4个类型的用户,提了八百遍的那三个,还有一个被称为 “ 全能神 ” 的root。
首先 root “全能神”,用于最高的权限肯定可以改。拥有者肯定也可以,我自己的东西想给谁看给谁看,我就算扔了你也管不了。其实不用实验验证都可以明确的说另外两个不可以。你自己想一下,这两类用户可以修改权限的话岂不乱套了。别人的东西,我修改一下权限就是我的了,别人了私密文件我也可以随意看了。
root : 权力极大可以改所有
拥有者:修改自己所拥有的文件
同组及其他:无修改权限
偷偷告诉你,拥有者可以给别人开特权,也就是说权限不仅仅 rwx。别急,这就是个稍后预告。

2.怎么改?

easy!easy!easy!
两种方式去修改:
(1)将权限字符转换成数字,有那个权限就加那个权限的数字
(2)直接将权限字符赋值给对应用户

1.转数字改

chmod  [-R]  xyz  文件或目录    ==>xyz表示对应的三个用户的权限。

文件的属性顺序也是固定的 拥有者、同组用户、其他用户,文件权限的顺序也是固定的 r w x,权限字符对应数字。所以每个用户都有一个r w x 顺序的权限,当然没有这个权限字母用 - 代替。每个用户都有一个权限字母相加组成的数。再按照文件属性对数排序,三种用户就应三个数字,例:
751 —>拥有者权限:rwx 同组用户权限:r - x 其他用户权限:- - x
444 —>拥有者权限:r - - 同组用户权限:r - - 其他用户权限:r - -

r : 4  ==>读
w : 2  ==>写
x : 1  ==>执行

-R:进行递归修改,将连同子级目录的所有权限都修改
上文中我们已经改了一次了,举了你同学在你书包里放情书的例子。你好像明白了目录和其子级目录或文件的所属没用关系。由于你天天帮忙送情书把你自己的书包送坏了,你同学拿他的书包给你用(没有送给你,就给你用用),新书包里还有一袋狗粮。他说书包了书包里的狗粮给你吃,你是不是可以用你同学的书包,还可以吃里面的狗粮。你同学要只说书包给你用用,那狗粮没说,那你就不能吃它的狗粮。这里的 - R 选项就可以认为是一个“都”字的作用。

root@erdeng-virtual-machine:~# ls -ld /tmp/testing/   /tmp/testing/testing
drwxr-x--x 2 erdeng root 4096 711 09:19 /tmp/testing/
-rw-r--r-- 1 root   root    0 711 09:19 /tmp/testing/testing
root@erdeng-virtual-machine:~# chmod 776 /tmp/testing/   <==不加-R选项的修改
root@erdeng-virtual-machine:~# ls -ld /tmp/testing/   /tmp/testing/testing
drwxrwxrw- 2 erdeng root 4096 711 09:19 /tmp/testing/ <==只有目录权限改变
-rwxr--r-- 1 root   root    0 711 09:19 /tmp/testing/testing
root@erdeng-virtual-machine:~# chmod -R 776 /tmp/testing/  <==-R选项的修改
root@erdeng-virtual-machine:~# ls -ld /tmp/testing/   /tmp/testing/testing
drwxrwxrw- 2 erdeng root 4096 711 09:19 /tmp/testing/<==目录和里面文件的权限都改变
-rwxrwxrw- 1 root   root    0 711 09:19 /tmp/testing/testing

2.赋字母权限修改

给三种用户进行缩写,分别用字母表示:

u : 拥有者
g : 同组用户
o :其他用户
a : 所有用户,对a的操作就是对所有用户的操作

采用直接赋字母的方式修改权限,选项[-R]状态下依然是符合的,自己试试看。

root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing  ==>查看目录和文件的权限
drwxrwxr-- 2 root root 4096 711 12:29 /tmp/testing
-rw-r--r-- 1 root root    0 711 12:29 /tmp/testing/testing
root@erdeng-virtual-machine:~# chmod u=rwx,g=rwx,o=rx /tmp/testing 
root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing
drwxrwxr-x 2 root root 4096 711 12:29 /tmp/testing
-rw-r--r-- 1 root root    0 711 12:29 /tmp/testing/testing
root@erdeng-virtual-machine:~# chmod u=rwx,g=rx,o=rx /tmp/testing/testing
root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing
drwxrwxr-x 2 root root 4096 711 12:29 /tmp/testing
-rwxr-xr-x 1 root root    0 711 12:29 /tmp/testing/testing

我现在想要一个r w x r - x r - x 权限的/tmp/testing 和一个r w x r - x r - - 权限类型的/tmp/testing/testing文件,怎么改呢?
我们确实可以采用一个个去转数字改或直接赋字母改,但是为了学习 a (相当于所有用户),以及 + 添加权限 ,- 删除权限。咱换个方法:

root@erdeng-virtual-machine:~# chmod -R  a=rx /tmp/testing ==>-R选择,
/tmp/testing目录及其它的子文件testing的权限都改变.怎么改呢?a=rx -->所有用户
的权限都变成 r - x
root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing
dr-xr-xr-x 2 root root 4096 711 12:29 /tmp/testing         ==>r-xr-xr-x
-r-xr-xr-x 1 root root    0 711 12:29 /tmp/testing/testing ==>r-xr-xr-x

/tmp/testing最终要求的权限是r w x r - x r - x,所以现在我们还在拥有者上缺少一个 w(写)权限,那我们给它 + :

root@erdeng-virtual-machine:~# chmod  u+w  /tmp/testing ==>谁缺用谁的缩写加
root@erdeng-virtual-machine:~# ls -ld /tmp/testing 
drwxr-xr-x 2 root root 4096 711 12:29 /tmp/testing

/tmp/testing/testing最终要求的权限是r w x r - x r - -,所以现在我们还在其他用户上多一个 x(执行)权限,那我们给它 - :

root@erdeng-virtual-machine:~# chmod  o-x  /tmp/testing/testing ==>谁多用谁的缩写减
root@erdeng-virtual-machine:~# ls -ld /tmp/testing/testing
-r-xr-xr-- 1 root root 0 711 12:29 /tmp/testing/testing

要是都多或都缺,可以有 a (所有用户)经行加减。

3.隐藏权限

隐藏权限对于文件数据安全性很重要,尤其在系统的数据安全上。

chattr [+-=][ASacdistu] 文件名或目录名

+:增加某一特殊参数,原本参数不变
-: 删除某一特殊参数,其他原本参数不变
=:直接设置参数,且仅有后面接的参数
a:当设置a之后,这个文件只能添加数据,而不能删除和修改数据,只有root才能设置此属性
i: 这个i,可以让文件不被删除、改名、设置链接也无法增添数据。只有root可以设置此权限

lsattr  [-adR]  文件目录

-a :连同隐藏属性显示
-R :连同子级目录的数据也一并列出来

4.文件特殊权限

SUID SGID SBIT
SUID :只要一个命令文件在主属性权限上的x变s的话,那么其他用户在执行在个命令文件时,就会以该命令文件的属主身份去执行。

如果该属性的权限位有执行权限,则会显示(小写)s。
如果该属性的权限位没有执行权限,则会显示(大写)S。

5.目录、文件、组的操作

我们知道文件除了拥有者,还有同组用户。对从王三毛给别人看情书,就开始一直文件文件。你看到这里了,此刻的你应该会如何查看文件的属性,并对权限和各用户有了认识。接下来,学习啥呢?哎!又是你那个恋爱的同学,这次他感情又进了一步,他将他的书包送给你作为感谢。咦!好家伙,你成了书包的拥有者,前两还是给你用用呢,大气了。总之书包的属性改变了,在linux中怎么改拥有者呢?

root@erdeng-virtual-machine:~# mkdir /tmp/testing      ==>创建目录
root@erdeng-virtual-machine:~# touch /tmp/testing/testing ==>在目录下创建文件
root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing
drwxr-xr-x 2 root root 4096 711 14:59 /tmp/testing
-rw-r--r-- 1 root root    0 711 14:59 /tmp/testing/testing
root@erdeng-virtual-machine:~# chown redeng /tmp/testing  ==>修改/tmp/testing的用户为redeng,但redeng用户不存在。所以失败
chown: 无效的用户: “redeng”
root@erdeng-virtual-machine:~# chown erdeng /tmp/testing==>修改/tmp/testing的用户为erdeng
root@erdeng-virtual-machine:~# ls -ld /tmp/testing /tmp/testing/testing
drwxr-xr-x 2 erdeng root 4096 711 14:59 /tmp/testing ==>修改成功
-rw-r--r-- 1 root   root    0 711 14:59 /tmp/testing/testing 
这里的拥有者为啥没改,前面已经讲清楚。你书包里的东西不一定都是你的,比如:你帮别人传的情书。
chown [-R] 账号名称 文件或目录             ==>修改拥有者
chown [-R] 账号名称:用户组名称  文件或目录  ==>修改拥有者和用户组

其实大家看到这里可能已经准备去自己亲手练习了,突然发现自己不会创建文件,也不会创建目录,也不会创建用户组。哈哈哈啊,不怪你不怪你。我们现在开始学,干ing

1.cd(含路径)

不废话了,捞干的。
我们创建目录都是创建到目标目录或指定的目录下,能够灵活的切换到要创建目录或文件的目录下就很重要了。要灵活得多练,那咱先学怎么切换目录。以后灵不灵活就看你自己了。
目录切换:

cd  [相对或绝对地址]

依旧我们学习命令的习惯来,先来搞清楚默认的功能。先来一波回忆杀,我们在学 ls 命令时,ls 后啥都不加是查看该用户的家目录下的文件和目录。回忆总想哭,啥也记不住.

root@erdeng-virtual-machine:~# cd 
root@erdeng-virtual-machine:~# cd ~
root@erdeng-virtual-machine:~# cd /root
root@erdeng-virtual-machine:~#

~ :用户的根路径。从:到 # 前的一串字符串代root当前目录的路径。上图 # 前面的 ~ 一直没变也就是cd默认就是到用户的根目录下, ~ 是根目录的相对路径 ,/root是root用户的绝对路径。

erdeng@erdeng-virtual-machine:~$ cd
erdeng@erdeng-virtual-machine:~$ cd ~
erdeng@erdeng-virtual-machine:~$ cd /home/erdeng ==>用户erdeng的绝对路径
erdeng@erdeng-virtual-machine:~$ 

对于linux这棵大树,所有的一切都源于根目录 / 。对于root和一般用户的位置肯定是不一样的,你别忘了 root 叫啥?人家可是管理员用户,管理员管理员管理员。你觉得root作为linux公司的大boss会和一般用户一起住在员工宿舍吗?肯定不会啊!不要想都知道root自己住单人大别野,为了自己的大别野更被记住,直接大别野叫root,直接在/下找root即可,所以root的根目录是/root。普通员工(一般用户)肯定住在员工宿舍了,所有一般用户都住在牛马大home里面,关键是home里面可能不单单一个普通员工,只知道住那个宿舍不知道床铺也不好找啊!对于计算机这个呆子,它肯定不会找,咋办?我给它说宿舍是home床铺是用户名,直接找到员工的床铺,所以一般用的根目录是/home/用户名。
跳转到根目录会了,咱还的会跳转到别的层级更多的目录才行,咋跳呢?无非就是 cd 命令后面的文件路径变一下。路径又分两种—绝对路径和相对路径,绝对路径达到的是路径完整的绝对,也就是说路径是从根目录开始的一个字母字符不少的路径。 相对路径与绝对路径的起始位置相反,相对路径不从根目录 / 开始。
相对路径是非常便捷的,一般对相对路径的使用有两种形式
(1)~ [后一段路径](2). . [后一段路径] 单单的告诉你,这是上一级目录中的[后一段路径]的路径,你肯定晕了。。。。看个例子吧

root@erdeng-virtual-machine:~# mkdir -p aaa/bbb/ccc/d1 ==>创建在~目录下的目录
root@erdeng-virtual-machine:~# mkdir  aaa/bbb/ccc/d2
root@erdeng-virtual-machine:~# mkdir  aaa/bbb/ccc/d3
root@erdeng-virtual-machine:~# ls -ld aaa/bbb/ccc/d*   ==>创建的目录展示
drwxr-xr-x 2 root root 4096 712 10:25 aaa/bbb/ccc/d1
drwxr-xr-x 2 root root 4096 712 10:25 aaa/bbb/ccc/d2
drwxr-xr-x 2 root root 4096 712 10:25 aaa/bbb/ccc/d3

root@erdeng-virtual-machine:~#cd ~/aaa/bbb/ccc/d1/ ==>由于目录在~下,用 ~ 来一起构成完整路径
root@erdeng-virtual-machine:~/aaa/bbb/ccc/d1# cd ../d2==>当前我们在~/aaa/bbb/ccc/d1目录下,我
们想要到aaa/bbb/ccc/d2目录去,但发现d1和d2都在~/aaa/bbb/ccc目录。所以用..跳回aaa/bbb/ccc,然后再
下到d2,这样就到达了~/aaa/bbb/ccc/d2
root@erdeng-virtual-machine:~/aaa/bbb/ccc/d2# cd ../d3
root@erdeng-virtual-machine:~/aaa/bbb/ccc/d3# 

aaa/bbb/ccc/d* 这三个目录都是创建在 ~ 下的目录所以在 ~ 目录下切换时,可以直接 cd aaa/bbb/ccc/d1

root@erdeng-virtual-machine:~# cd aaa/bbb/ccc/d1
root@erdeng-virtual-machine:~/aaa/bbb/ccc/d1#

cd 还有一个好用的 cd - ,切换上一个工作目录

root@erdeng-virtual-machine:~/aaa/bbb/ccc/d1# cd -  ==>切换上一个目录
/root
root@erdeng-virtual-machine:~# cd - 
/root/aaa/bbb/ccc/d1
root@erdeng-virtual-machine:~/aaa/bbb/ccc/d1# cd -
/root

目录的类型总结一下:

.           ==>此层目录
..          ==>上一层目录
-           ==>前一个工作目录
~           ==>当前用户的根目录
~ erdeng    ==>代表erdeng这个用户的家目录(erdeng是个账号名称)
2.目录创建(mkdir)
mkdir [-mp] 目录名

你要创建文件你是不是的告诉计算机你要啥样的文件,默认形式的简单,那不想要默认形式的文件就得加选择来约束一下下了。

-m :设置文件权限
-p :递归创建

咱先说说 [-m] 选项,设置文件权限。你别说还真是,咱们修改文件的权限,却没想过它原本的权限是怎么来的。尴尬了,没关系现在补上。
我们创建几个默认的目录和文件来观察他们的权限有什么特点:

root@erdeng-virtual-machine:~# cd /tmp  ==>在tmp目录下创建,tmp目录是临时存储器和临时目录的特殊目录,
关机重启后创建在里面的文件丢失,刚好我们在它下面创建文件来练手。
root@erdeng-virtual-machine:/tmp# mkdir test1
root@erdeng-virtual-machine:/tmp# mkdir test2
root@erdeng-virtual-machine:/tmp# mkdir test3
root@erdeng-virtual-machine:/tmp# ls -ld test* ==>后面加*表示以test开头的文件或目录
drwxr-xr-x 2 root   root 4096 711 15:42 test1
drwxr-xr-x 2 root   root 4096 711 15:43 test2
drwxr-xr-x 2 root   root 4096 711 15:43 test3

创建三个test开头的文件一个一个字的打,太麻烦了。其实你可以输入mkdir test1 命令后点击上移键自动将mkdir test1复制下来,将我们把结尾的1 改 2即可,多用上移键和下移键更便捷。
可见默认目录的权限是一样的,哦哦哦,原来此时目录默认的权限是 r w x r - x r - x,为什么说是此时呢?因为它可以改,默认值也可以改。我们想要创建很多一样权限的目录,我们提前改好默认权限,然后默认创建,是不是非常便捷呢?

root@erdeng-virtual-machine:/tmp# umask  ==>单单输入umask命令即可查看当前创建目录的默认属性
0022     ==>后三个是一般的默认权限,022——>rwxr-xr-x
root@erdeng-virtual-machine:/tmp# umask 0002  ==>在umask后加上修改后默认权限的数值,即可完成修改
root@erdeng-virtual-machine:/tmp# umask  ==>现在再去查看默认权限,已经被改成了0002
0002
root@erdeng-virtual-machine:/tmp# mkdir test4   ==>在现在的默认状态下去创建目录
root@erdeng-virtual-machine:/tmp# mkdir test5
root@erdeng-virtual-machine:/tmp# ls -ld test*
drwxr-xr-x 2 root   root 4096 711 15:42 test1
drwxr-xr-x 2 root   root 4096 711 15:43 test2
drwxr-xr-x 2 root   root 4096 711 15:43 test3 ==>test 1-3是原本默认权限
drwxrwxr-x 2 root   root 4096 711 16:22 test4
drwxrwxr-x 2 root   root 4096 711 16:22 test5 ==>test 4-5是修后的默认权限

为什么是umask的默认值就是一般权限部分是 : 022 ?
我们本知识点最重要的点要知道,umask是什么?它是掩码,用于屏蔽(即不允许)某些权限位来影响新创建文件或目录的权限。umask的值有多少就在全权限中减去多少。
(1)对于创建的文件,它的全权限其实是666,也就是任何用户可读可写,这样太不安全了。默认为的umask是022,那么文件的权限也就是全权限减去022,每一次对应减,这并非十进制减法。666-022=644,当前文件的权限是644。数字转字母对于初学者更加直观644—>r w - r - - r - - ,文件拥有者有可执行读写,同组用户可读,其他用户可读,这样更加安全。
(2)对于目录而言,目录的全权限是777,当看到此处有人可能会疑惑,为什么目录的全权限就比文件多了111 ?这还不明白吗,111就是三类用户在目录上比文件多的执行权限啊!我们要搞清目录与文件的关系,文件都是放在目录下的,目录里面包含目录和文件。包目录看成一个大箱子,文件看作一幅画,你不打开箱子你就不可能看到箱子里面是否有比它小的箱子或画,而你开箱子的权限就是执行权限(x)。要是能打开箱子读写权限即使有也无法实现。画就不存在打不打开操作。
目录的默认umask掩码是022,全权限减去掩码,权限则是755。也就是 r w x r - x r - x ,拥有者对目录是读写执行,同组用户是读与执行,其他用户是读与执行。这确保了目录的安全。

默认的权限的文件我们会创建了,也知道其原理了。关键应用中我们要具体问题具体对待,创建默认权限的文件再去改太麻烦。现在就可以去引进 -m ,设置目录权限

mkdir -m  xyz  目录名称

我们要在建一个/tmp/testing1的目录,权限为r w x r w x r - -,该权限转为数字是774

root@erdeng-virtual-machine:~# cd /tmp   
root@erdeng-virtual-machine:/tmp# mkdir -m 774 testing1 ==>直接创建774权限的目录
root@erdeng-virtual-machine:/tmp# ls -ld testing1
drwxrwxr-- 2 root root 4096 711 21:35 testing1
root@erdeng-virtual-machine:/tmp# mkdir testing2 ==>创建一个默认权限的文件
root@erdeng-virtual-machine:/tmp# ls -ld testing2
drwxr-xr-x 2 root root 4096 711 21:34 testing2 ==>默认权限仍是755

使用 -m 选项的创建目录方式仅对自己创建的目录的权限有影响,而不改变默认值。umask是直接改变接下来所有目录的权限。
在修改用户权限时除了数字,还有一种方法即使是直接复字母。都是对权限起作用,那么创建时也可以如此。

root@erdeng-virtual-machine:/tmp# mkdir  -m u=rwx,g=rwx,o=x testing3
root@erdeng-virtual-machine:/tmp# ls -ld testing3
drwxrwx--x 2 root root 4096 711 21:47 testing3

3.创建多级目录
现在让我们去创建一个/tmp/test1/test2/test3的多级目录。

root@erdeng-virtual-machine:~# mkdir /tmp/test1/test2/test3
mkdir: 无法创建目录 “/tmp/test1/test2/test3”: 没有那个文件或目录

mkdir在默认状态下只能创建单级目录,也就是说一次mdir的使用只能创建一层目录,那么我们可以逐层递进去创建:

root@erdeng-virtual-machine:~# mkdir /tmp/test1
root@erdeng-virtual-machine:~# mkdir /tmp/test1/test2
root@erdeng-virtual-machine:~# mkdir /tmp/test1/test2/test3
root@erdeng-virtual-machine:~# ls -ld /tmp/test1/test2/test3
drwxr-xr-x 2 root root 4096 711 22:48 /tmp/test1/test2/test3

这种方式的确创建成功了,但是也太麻烦了。由于/tmp/test1/test2/test3该目录咱们已经创建,现在还没有学过删除目录,咋办呢?那咱就用/tmp/test2/test3/test4目录练手吧!
现在我们使用一个选项[-p]来辅助我们去创建:

mkdir -p 目录名称
root@erdeng-virtual-machine:~# mkdir -p  /tmp/test2/test3/test4
root@erdeng-virtual-machine:~# ls -ld /tmp/test2/test3/test4
drwxr-xr-x 2 root root 4096 711 22:55 /tmp/test2/test3/test4

的确简便!你若是细心的话,你肯定会发现两次创建的目录貌似有啥隐义,啥隐义呢? 第一个目录路径:/tmp/test1/test2/test3 第二个目录径:/tmp/test2/test3/test4
回忆前文是不是说过文件的目录一定是层层递进不能有“跳层”的现象,否则报错。有人直接问你根目录下的test2,你能知道是/tmp/test1/test2 还是/tmp/test2吗?你都不知道,计算机肯定也不知道啊!己所不知勿问于机!!!!

3.目录删除(rmdir)

前面都提到了删除目录,也发现自己不会。咋办?学啊!啥时候学?现在啊!
删除目录:

rmdir  [-p]  目录名称

学新知识了,练练!刚才咱们创建了两个在/tmp下的test*的目录,这两个文件创建了貌似也没啥用,现在删了。

root@erdeng-virtual-machine:~# ls -ld /tmp/test*  ==> 删除得东西得有才行,你没有就没法删,那我看看有哪些/tmp下的test*的目录
drwxr-xr-x 3 root root 4096 711 22:48 /tmp/test1
drwxr-xr-x 3 root root 4096 711 22:55 /tmp/test2
root@erdeng-virtual-machine:~# rmdir /tmp/test1 ==>删除 /tmp/test1
rmdir: 删除 '/tmp/test1' 失败: 目录非空

咦!乖来,失败!提示说不是空的,哦哦!/tmp/test1目录下还有test2/test3,那这么看/tmp/test1/test2也不是空,/tmp/test1/test2/test3是空。创建是我们逐层创建也是干过的,现在大不了就逐层删了。

root@erdeng-virtual-machine:~# rmdir /tmp/test1/test2/test3
root@erdeng-virtual-machine:~# rmdir /tmp/test1/test2
root@erdeng-virtual-machine:~# rmdir /tmp/test1
root@erdeng-virtual-machine:~# ls -ld /tmp/test*
drwxr-xr-x 3 root root 4096 711 22:55 /tmp/test2 ==>现在就剩这一个了,说明删除成功。

删除成功但步骤太多,麻烦!来个一步到位的 加一个[-p]的选项

root@erdeng-virtual-machine:~# ls -ld /tmp/test*        ==>查看有没有
drwxr-xr-x 3 root root 4096 711 23:47 /tmp/test2    ==>有  
root@erdeng-virtual-machine:~# rmdir -p  /tmp/test2/test3/test4 ==>删了
rmdir: 删除目录 '/tmp' 失败: 目录非空   ==>咦!非空失败!
root@erdeng-virtual-machine:~# ls -ld /tmp/test*  ==>再看一下文件还在不在
ls: 无法访问 '/tmp/test*': 没有那个文件或目录   ==>不在了,删掉了。
现在仔细看删除失败的提醒,/tmp删除失败!!!

原来[-p]不是强迫的全部删除,它是将道理的。讲什么道理呢?逐级删除空目录,那它就是从test4开始向根目录一级一级的删。若本级是空目录先删除,再跳到上一级。重复删除,直到下一级是空,删除本级任然有别的目录后文件(通俗的说就是目录中不仅仅删除的目录一个文件,删了这一个还有别的)。/tmp/test2/test3/test4
删除结果是/tmp删除失败,但test2/test3/test4都已被删除。从后往前一直删删到非空为止。

 vmware-root_816-2965579223
root@erdeng-virtual-machine:~# ls -l /tmp ==>查看/tmp中的文件和目录
总用量 60
drwxr-xr-x 2 root   root   4096 711 21:47 'g=rwx'
drwxr-xr-x 2 root   root   4096 711 21:47 'o=x'
drwx------ 2 root   root   4096 711 21:13  snap-private-tmp
drwx------ 3 root   root   4096 711 21:14  systemd-private-af11339fc4564915a5ab34fd2b1705ea-colord.service-t3N44i
drwx------ 3 root   root   4096 711 22:36  systemd-private-

test2/test3/test4删除后,tmp目录下部分目录展示——>/tmp非空。这就是/tmp删除失败的原因。

4.文件创建(touch)

用touch命令来创建空文件,同时修改已有文件的访问时间和修改时间。原来访问文件和修改文件都是有记录的。
说到这就得先说一下文件的三个时间状态:
(1)修改文件时间(modification time,mtime):文件里面的数据修改时,更新时间。
(2)状态时间(status time ,ctime):文件的权限的属性改变时,更新时间。
(3)读取时间(access time,atime):读取文件时,更新时间。
touch,
创建一个新空文件,文件为在/tmp/touching/touch1

root@erdeng-virtual-machine:~# cd /tmp
root@erdeng-virtual-machine:/tmp# mkdir touching    ==/tmp目录下创建touching目录  
root@erdeng-virtual-machine:/tmp# cd touching ==>切换到/tmp/touching目录
root@erdeng-virtual-machine:/tmp/touching# touch touch1==>创建touch1文件
root@erdeng-virtual-machine:/tmp/touching# cd 
root@erdeng-virtual-machine:~# ls -ld /tmp/touching/touch1==>显示文件状态
-rw-r--r-- 1 root root 0 712 15:00 /tmp/touching/touch1

说touch创建的文件已存在的话,touch命令不会覆盖文件内容,而是更新文件的访问时间和修改时间为当前时间。那目录也没说能不能以这种方式更新,大胆尝试。

root@erdeng-virtual-machine:~# cd /tmp
root@erdeng-virtual-machine:/tmp# mkdir touching  ==>再在/tmp下创建一次touching目录
mkdir: 无法创建目录 “touching”: 文件已存在 ==>不行
root@erdeng-virtual-machine:/tmp# cd touching
root@erdeng-virtual-machine:/tmp/touching# touch touch1 ==>在创建touch1
root@erdeng-virtual-machine:/tmp/touching# cd 
root@erdeng-virtual-machine:~# ls -ld /tmp/touching/touch1==>查看状态
-rw-r--r-- 1 root root 0 712 15:17 /tmp/touching/touch1 ==>时间果然更新了
但文件还是原来的文件,没有创建第二个。

确实 ls 显示出来的时间改变了,文件的的属性和权限都没改,状态时间(ctime)肯定没改,这个时间不是状态时间。ls 展示的时间就是修改时间(mtime),对于为什么是修改时间(mtime)而不是(access time,atime)读取时间,具体原因我猜哈!我猜是读取时间没有修改时间重要。文件存储的数据有了变动是肯定要注意的,至于啥时候读了可能不是相对不是那么重要。
所以说目录与文件能不能对存在的"重建",其主要原因在于各自本身的属性。
大多数文件系统中,目录的创建和修改时间都是固定的,或者在特定的情况下才更新,对于特定的情况咱们暂时不考虑。目录在文件系统中扮演着特殊的角色,它不仅是文件的容器,还包含了文件的组织结构信息。因此,目录的时间戳属性被设计的不能轻易的更改,以保持文件系统的稳定性和一致性。
此时我们需要在/tmp/touching目录下创建txt1,txt2,txt3,txt4文件,一个一个创建太麻烦直接一次批量创建更省事。
使用通配符创建

touch txt{1..4}
root@erdeng-virtual-machine:/tmp# cd ~
root@erdeng-virtual-machine:~# mkdir /tmp/touching
root@erdeng-virtual-machine:~# cd /tmp/touching
root@erdeng-virtual-machine:/tmp/touching# touch txt{1..4}
root@erdeng-virtual-machine:/tmp/touching# ls -ld txt*
-rw-r--r-- 1 root root 0 712 15:53 txt1
-rw-r--r-- 1 root root 0 712 15:53 txt2
-rw-r--r-- 1 root root 0 712 15:53 txt3
-rw-r--r-- 1 root root 0 712 15:53 txt4

现在要求创建file_1.txt到file_100.txt文件
使用循环结构批量创建文件(更适合复杂文件名或更多文件时):

root@erdeng-virtual-machine:/tmp# for c in {1..100};do touch file_${c}.txt;done
root@erdeng-virtual-machine:/tmp# ls -ld file_*
-rw-r--r-- 1 root root 0 712 16:04 file_100.txt
-rw-r--r-- 1 root root 0 712 16:04 file_10.txt
-rw-r--r-- 1 root root 0 712 16:04 file_11.txt
-rw-r--r-- 1 root root 0 712 16:04 file_12.txt
-rw-r--r-- 1 root root 0 712 16:04 file_13.txt
-rw-r--r-- 1 root root 0 712 16:04 file_14.txt
-rw-r--r-- 1 root root 0 712 16:04 file_15.txt
-rw-r--r-- 1 root root 0 712 16:04 file_16.txt

部分省略
for c in {1…100}设置c的范围,do touch file_${c}.txt执行创建文件,done结束。这语法简单就不多解释了。
现在我们多加几个选项把touch玩花一点,OK!

-a :自己定义最后一次访问时间,啥是访问呢?通常指文件或目录被读取的操作。
-c :只对存在的文件修改时间,不存在也不创建新文件。一种摆烂的态度,有就改,没有就算。
-m :仅修改mtime,进修改修改文件内容的时间。
-a、-m 就是对应两种时间的首字母,要改谁用谁的首字母的选项。

-d :后面结自己定义的时间而不是当前的时间,也可以使用--date="日期或时间"
-t :后面结自己定义的时间而不是当前的时间,格式是[YYYYMMDDhhmm]
-d、-t 就是自定义时间的两种方式。

对于选项 -d 的“日期或时间”有两种方式:
(1)指定具体时间戳 “YYYY-MM-DD hh:mm:ss”
(2)相对时间,使用字符串,例如:now tomrrow yesterday +5 days等
要求:创建一个读取时间设定为2024/07/13 00:31的文件
设定读取时间用 -a 选项,自定义时间方式先用 -t 再用 -d

root@erdeng-virtual-machine:/tmp/testing# touch -a -t 202407130031 test1
root@erdeng-virtual-machine:/tmp/testing# ll --time=atime test1
-rw-r--r-- 1 root root 0 713 00:31 test1

在此创建 test1文件,我们前面学过说touch创建的文件已经存在会改变 atime与mtime,但是加了 -d 来自定义还自定义为:2024-07-13 00:31 ,所以两次 atime时间一样。

root@erdeng-virtual-machine:/tmp/testing# touch -a -d "2024-07-13 00:31" test1
root@erdeng-virtual-machine:/tmp/testing# ll --time=atime test1;ll  test1
-rw-r--r-- 1 root root 0 713 00:31 test1 ==>atime
-rw-r--r-- 1 root root 0 713 00:33 test1 ==>mtime

我在此处犯了一个错误,什么错误呢?就是 --time=atime,这是限定 ll 命令展示的时间是 atime。但是对于mtime 不是这样,mtime是 ll 显示文件时默认展示的时间 ,没有这一说,直接 ll + 文件名即可。
相对时间选项的使用

root@erdeng-virtual-machine:~# cd /tmp
root@erdeng-virtual-machine:/tmp# mkdir  testing
root@erdeng-virtual-machine:/tmp# cd testing
root@erdeng-virtual-machine:/tmp/testing# touch  -m -d "+5 days" test
root@erdeng-virtual-machine:/tmp/testing# date;ll --time=atime test;ll  test
20240713日 星期六 01:13:47 CST   ==>今天时间是13-rw-r--r-- 1 root root 0 713 01:11 test ==>未被指定的atime,13-rw-r--r-- 1 root root 0 718  2024 test ==>被指定+5 days 的mtime,18
5 文件删除(rm)
-f :force==强迫使用的意思,删除不存在的文件时,也不会警告错误
-I :删除前询问使用者是否操作
-r :递归删除,常用于目录删除,一下删除一大串。与mkdir的区别在于,mkdir删除是空目
录,而 rm -r 是全删不管空不空,一定要谨慎使用

我们前面说过目录删除命令是rmdir,现在说文件删除是rm。但是我们在目录删除时也遇到一个问题就是rmdir -p 递归删除只能删除空目录,要是目录下有很多子目录和文件,那就得一个一个的子目录或子文件删除完后才能删除该目录。这确实有点麻烦,但是一下删除目录即里面所有的文件要提前考虑好,不然别一条命令执行后重装虚拟机去了。

root@erdeng-virtual-machine:/tmp# mkdir -p test1/test2/test3/test4
root@erdeng-virtual-machine:/tmp# rm test1    
rm: 无法删除 'test1': 是一个目录
root@erdeng-virtual-machine:/tmp# rm -I test1
rm: 无法删除 'test1': 是一个目录
root@erdeng-virtual-machine:/tmp# rm -f test1
rm: 无法删除 'test1': 是一个目录          ==>默认,-I,-f 都不能删除目录
root@erdeng-virtual-machine:/tmp# rm -r test1  ==> -
root@erdeng-virtual-machine:/tmp# ls -ld test1/test2/test3/test4
ls: 无法访问 'test1/test2/test3/test4': 没有那个文件或目录
root@erdeng-virtual-machine:/tmp# mkdir -p test1/test2/test3
root@erdeng-virtual-machine:/tmp# mkdir -p test1/test4/test5
root@erdeng-virtual-machine:/tmp# ls -ld test1/test*
drwxr-xr-x 3 root root 4096 713 22:57 test1/test2
drwxr-xr-x 3 root root 4096 713 22:57 test1/test4
root@erdeng-virtual-machine:/tmp# rm -r test1
root@erdeng-virtual-machine:/tmp# ls -ld test1
ls: 无法访问 'test1': 没有那个文件或目录   ==>test1下有test2和test3两个目录不空,但是删除成功。

OK!rm加 -r 选项时可对目录非空目录进行删除处理,但是 rm 貌似是对文件的处理,咱看看文件的处理吧!

root@erdeng-virtual-machine:/tmp# ls -ld test1  ==>先看看文件test1是否存在
ls: 无法访问 'test1': 没有那个文件或目录   ==>不存在
root@erdeng-virtual-machine:/tmp# rm -f test1  ==>不存在也去删除,强迫删除,不存在也不提示。
root@erdeng-virtual-machine:/tmp#
root@erdeng-virtual-machine:/tmp# mkdir test1
root@erdeng-virtual-machine:/tmp# touch test1/test2
root@erdeng-virtual-machine:/tmp# ls -l test1/test2
-rw-r--r-- 1 root root 0 713 23:11 test1/test2
root@erdeng-virtual-machine:/tmp# rm -I test1/test2
root@erdeng-virtual-machine:/tmp# ls -l test1/test2
ls: 无法访问 'test1/test2': 没有那个文件或目录
6.文件复制(cp)
cp  [选项] 源文件 目标文件
cp [选项] 源文件1  源文件2 源文件3 ......directory  ==>将前面的文件复制到最后一个文件
- i :若目标文件已存在,再覆盖时先询问操作的进行
- p :连同文件的属性一起复制过去,而非使用默认属性(备用使用)
- r :递归复制,用于目录的复制操作
- a :完全复制

root身份,将主文件夹下的 .bashrc 复制到 /tmp下,并更名为bashrc

root@erdeng-virtual-machine:~# cp ~/.bashrc /tmp/bashrc
root@erdeng-virtual-machine:~# cp -i ~/.bashrc /tmp/bashrc  ==>复制
cp:是否覆盖'/tmp/bashrc'? y

变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:

root@erdeng-virtual-machine:~# cd /tmp
root@erdeng-virtual-machine:/tmp# cp /var/log/wtmp .
root@erdeng-virtual-machine:/tmp# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 56064 714 14:10 /var/log/wtmp
-rw-r--r-- 1 root root 56064 714 14:10 wtmp
#注意观察上面,在不加任何选项的情况下,文件的属性/权限改变

如果要想将文件的特性都一起复制,可以加上 -a 选项。-a相当于-d、-p、-r的集合

root@erdeng-virtual-machine:/tmp# cp -a /var/log/wtmp wtmp2
root@erdeng-virtual-machine:/tmp# ls -l /var/log/wtmp wtmp2
-rw-rw-r-- 1 root utmp 56064 714 14:10 /var/log/wtmp
-rw-rw-r-- 1 root utmp 56064 714 14:10 wtmp2    ==>属性相同

创建一个链接文件,链接文件有两种:
(1)软链接:
(2)硬链接:

root@erdeng-virtual-machine:/tmp# ls -l bashrc
-rw-r--r-- 1 erdeng erdeng 3106 714 13:12 bashrc
root@erdeng-virtual-machine:/tmp# cp -s bashrc bashrc_slink
root@erdeng-virtual-machine:/tmp# cp -l bashrc bashrc_hlink
root@erdeng-virtual-machine:/tmp# ls -l bashrc*
-rw-r--r-- 2 erdeng erdeng 3106 714 13:12 bashrc
-rw-r--r-- 2 erdeng erdeng 3106 714 13:12 bashrc_hlink  ==>与bashrc的区别在于在于多建了一个软连接,链接数由12。
lrwxrwxrwx 1 root   root      6 714 14:31 bashrc_slink -> bashrc  ==>硬链接通过快捷键的方式访问文件
7.移动文件与文件,或重命名(mv)
mv [-fiu] source destination
mv [options] source1 source2 source3 ...directory
-f :强迫执行,如果目标文件已存在,不会询问直接覆盖
-i :如目标文件已存在,询问是否覆盖
-u :若目标文件已存在,且source比较新,才会更新

文件复制

erdeng@erdeng-virtual-machine:~$ cd /tmp
erdeng@erdeng-virtual-machine:/tmp$ cp ~/.bashrc bashrc
erdeng@erdeng-virtual-machine:/tmp$ mkdir mvtest  ==>创建一个新文件
erdeng@erdeng-virtual-machine:/tmp$ mv bashrc mvtest  ==>将bashrc复制到mvtest 

文件重命

erdeng@erdeng-virtual-machine:/tmp$ mv mvtest mvtest1  ==>将mvtest重命名为mvtest1

多个文件移到目标目录下

erdeng@erdeng-virtual-machine:/tmp$ cp ~/.bashrc bashrc1
erdeng@erdeng-virtual-machine:/tmp$ cp ~/.bashrc bashrc2
erdeng@erdeng-virtual-machine:/tmp$ mkdir mvtest2
erdeng@erdeng-virtual-machine:/tmp$ mv bashrc1 bashrc2 mvtest2
erdeng@erdeng-virtual-machine:/tmp$ ls -l mvtest2
总用量 8
-rw-r--r-- 1 erdeng erdeng 3771 714 22:11 bashrc1
-rw-r--r-- 1 erdeng erdeng 3771 714 22:11 bashrc2
8.basename和dirname

每个文件都包括前面的目录和最终的目录名,文件名获取用basename,目录的获取用dirname

erdeng@erdeng-virtual-machine:~$ basename /etc/sysconfig/network
network  ==>文件名
erdeng@erdeng-virtual-machine:~$ dirname /etc/sysconfig/network
/etc/sysconfig  ==目录名
9 .创建用户和组

创建用户

useradd [选项] 用户名

只有root才能创建用户

erdeng@erdeng-virtual-machine:~$ adduser aaa
adduser:只有 root 才能将用户或组添加到系统。
erdeng@erdeng-virtual-machine:~$ su -
密码: 
root@erdeng-virtual-machine:~# adduser aaa
正在添加用户"aaa"...
正在添加新组"aaa" (1004)...
正在添加新用户"aaa" (1003) 到组"aaa"...
创建主目录"/home/aaa"...
正在从"/etc/skel"复制文件...
新的 密码: 
重新输入新的 密码: 
passwd:已成功更新密码
正在改变 aaa 的用户信息
请输入新值,或直接敲回车键以使用默认值
	全名 []: 

默认情况下adduser在创建用户时会自动调用/etc/adduser.conf
在创建用户主目录时默认在/home下,而且创建为/home/用户名

7.链接

链接分两种,软连接与硬链接。
软连接:软链接相当于windows桌面快捷方式,若把源文件删除,软连接也被删除。软链接可以用于不同的文件系统,可以用于指向文件或特殊文件,而不仅局限于常规文件。
硬链接:硬链接相当于复制,将源文件删除不对硬链接起作用。局限是只能用于常规文件,只有当两个文件位于同一个文件系统上,才能使用硬链接。

七.查看文件

查看文件就需要用查看文件的命令, 文件查看命令有cat/tac/nl ,看接下来就认真学学这几个命令吧!

1.cat

cat是将一个文件的内容连续打印在屏幕上面

-b :列出行号,仅针对非空白行号显示,空白行不标行号
-n :打印行号,连同空白打印
root@rhce:~# cat /etc/issue  ==>默认状态的文件内容显示
Ubuntu 20.04.6 LTS \n \l

root@rhce:~# cat -b /etc/issue  ==>显示文件内非空的行号
     1	Ubuntu 20.04.6 LTS \n \l

root@rhce:~# cat -n /etc/issue  ==>显示文件的行号连同空行
     1	Ubuntu 20.04.6 LTS \n \l
     2	

-b 、-n 都是对前面行号的标志选项

-v :列出一些看不清楚的字符
-T :[tab]键以^T显示出来
-E :将结尾的换行符$显示出来
-a :等价于[-ETV],可列出一些特殊的字符不是空白而已

-v 、-T、-E、-a 都是对行内展示 -T是Tab ,-E是结尾,-v是看不清的字符。-a则是 -v、-T、-E的结合。

root@rhce:~# cat -A /etc/issue
Ubuntu 20.04.6 LTS \n \l$
$

2.tac

tac刚好是cat的字母倒置,cat正序显示文件内容,tac也就是倒序显示文件内容。

root@rhce:/# tac /etc/issue

Ubuntu 20.04.6 LTS \n \l

与cat /ect/issue 结果刚好相反。

3.nul

nul作为显示的一个命令,不同的显示需要也对应不同的选项
nul的默认状态就是非空行显示行号

root@rhce:/# nl   /etc/issue
     1	Ubuntu 20.04.6 LTS \n \l
      
-b 用来指定行号,和cat一样,对于空行显不显示
(1-b a 空行也显示,相当于cat -n 
(2-b t 空行不显示行号,相当于cat -b,也等同于默认状态
root@rhce:/# nl -b a /etc/issue  
     1	Ubuntu 20.04.6 LTS \n \l
     2      
root@rhce:/# nl -b t  /etc/issue   
     1	Ubuntu 20.04.6 LTS \n \l
     	
```、
不仅nl能够选择是否显示空行行号,同时还可以选择行号显示模式
```c
-n  ln :行号在行最左边显示
-n  rn :行号在自己局域栏最右边显示
-n  rz :行号在自己栏的最右边显示,并且前面加0
root@rhce:/# nl -n ln /etc/issue
1     	Ubuntu 20.04.6 LTS \n \l
       
root@rhce:/# nl -n rn /etc/issue
     1	Ubuntu 20.04.6 LTS \n \l
       
root@rhce:/# nl -n rz /etc/issue
000001	Ubuntu 20.04.6 LTS \n \l
     

我们也可以控制行号在自己栏的左右放置,到我还想去学会设置行号的占位(默认的占位数是6)

-w n :自己栏想几位n就是几
root@rhce:/# nl -w 3 -n rz /etc/issue
001	Ubuntu 20.04.6 LTS \n \l    ==>自己栏的占位符变成3,001一共占3

4.more与less

对于cat、tac、nl 三个显示命令都是一下把文件内容全部展示,可以用more去一页一页的显示,我们就可以一页一页去观察。

more 文件名

more在运行过程中,有几个按键可以使用:
空格键【space】:向下翻一页
【Enter】:向下翻一行
/ 字符串:代表显示的内容中,向下查找字符串这个关键词
:f :立刻显示文件名和当前显示的行数
q :离开more ,不再显示文件内容
b 或【ctrl】b :代表往回翻页,不过这操作仅对文件有用对管道无用

less 文件名

空格键【space】:向下翻一页
【pagedown】:向下翻一页
【pageup】:向上翻一页
/ 字符串:向下查找字符串
?字符串:向上查找字符串
g :前进到数据第一行
G:前进到数据最后一行
q:离开

5.数据截取

从文件中截取数据,怎么截呢!从头截,从尾巴截。
从头截截head
从尾巴截tail

head [-n number] 文件名

head截取默认状态是截取前10行

root@rhce:~# head /etc/debconf.conf
# This is the main config file for debconf. It tells debconf where to
# store data. The format of this file is a set of stanzas. Each stanza
# except the first sets up a database for debconf to use. For details, see
# debconf.conf(5) (in the debconf-doc package).
#
# So first things first. This first stanza gives the names of two databases.

# Debconf will use this database to store the data you enter into it,
# and some other dynamic data.
Config: configdb

那我们现在想要截取前20行怎么办?简单,加选项就是了。

root@rhce:~# head -n 20 /etc/debconf.conf
# This is the main config file for debconf. It tells debconf where to
# store data. The format of this file is a set of stanzas. Each stanza
# except the first sets up a database for debconf to use. For details, see
# debconf.conf(5) (in the debconf-doc package).
#
# So first things first. This first stanza gives the names of two databases.

# Debconf will use this database to store the data you enter into it,
# and some other dynamic data.
Config: configdb
# Debconf will use this database to store static template data.
Templates: templatedb

# World-readable, and accepts everything but passwords.
Name: config
Driver: File
Mode: 644
Reject-Type: password
Filename: /var/cache/debconf/config.dat

那我现在不想要后面的行数,怎么办呢?要前20行是 -n 20 ,不要后20行就 -n -20。不要后number行,就-n -number 。

head -n 100 文件名 ==>只显示文件的前100行
head -n -100 文件名 ==>文件的后100行不显示

tail

root@rhce:~# tail /etc/debconf.conf
# writes always go to the first database.
#Name: fulldb
#Driver: Stack
#Stack: configdb, remotedb
#
# In this example, we'd use Config: fulldb at the top of the file
# to make it use the combination of the databases.
#
# Even more complex and interesting setups are possible, see the 
# debconf.conf(5) page for details.
root@rhce:~# tail -n -20 /etc/debconf.conf
#Name: remotedb
#Driver: LDAP
#Server: remotehost
#BaseDN: cn=debconf,dc=domain,dc=com
#BindDN: uid=admin,dc=domain,dc=com
#BindPasswd: secret
#KeyByKey: 0
#
# A stack consisting of two databases. Values will be read from
# the first database in the stack to contain a value. In this example,
# writes always go to the first database.
#Name: fulldb
#Driver: Stack
#Stack: configdb, remotedb
#
# In this example, we'd use Config: fulldb at the top of the file
# to make it use the combination of the databases.
#
# Even more complex and interesting setups are possible, see the 
# debconf.conf(5) page for details.

八.配置主机名

使用hostnamectl命令

hostnamectl set-hostname newname  ==>设置主机名
root@erdeng-virtual-machine:~# cat /etc/hostname  ==>查看当前主机名 
erdeng-virtual-machine
root@erdeng-virtual-machine:~# hostnamectl set-hostname rhce ==>配置新主机名为rhce
root@erdeng-virtual-machine:~# bash ==>刷新
root@rhce:~# hostname ==>查看主机名
rhce      ==>配置成功

九.重定向

1.echo

echo命令是脚本语言的常用命令,作用相当于c语言中的printf。在shell中,可以打印变量的值,或者输出指定的字符串,可以将结果写入文件,也可以打印在终端。echo命令可以在显示器上显示一段文字,起到提示的作用。

2.diff

diff用来比较两个文本文件的差异,告诉你文件有何变动。

3.输入重定向

将输出重定向到文件

>file :重定向stdout以覆盖文件
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1  ===>创建一个test1的文件
erdeng@rhce:/tmp/testing$ echo "Hello"> test1 ==>将“Hello”重定向到test1
erdeng@rhce:/tmp/testing$ cat test1
Hello  ==>结果为Hello
erdeng@rhce:/tmp/testing$ echo "World">test1 ==>将“World”重定向到test1
erdeng@rhce:/tmp/testing$ cat test1
World  ==>结果为World,覆盖了Hello。先清空,然后再重新输入。
>>file :重定向stdout以附加到文件
erdeng@rhce:/tmp$ rm -r testing ==>先删除刚才创建的test1
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1  ==>创建文件
erdeng@rhce:/tmp/testing$ echo "Hello" >>test1  ==>将Hello添加到test1
erdeng@rhce:/tmp/testing$ cat test1
Hello      ==>添加Hello到test1
erdeng@rhce:/tmp/testing$ echo "World">>test1 ==>追加World到test1
erdeng@rhce:/tmp/testing$ cat test1
Hello   
World  ==>将World添加到Hello,文件的内容是 Hello World

2>file :重定向stderr以覆盖文件

erdeng@rhce:/tmp/testing$ echo "Hello">test1
erdeng@rhce:/tmp/testing$ cat test1
Hello       ==将Hello重定向到test1中
erdeng@rhce:/tmp/testing$ ls -0 2>test1
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。  ==>将错误覆盖到test1文件
erdeng@rhce:/tmp/testing$ 

2>/dev/null :将stderr错误信息重定向到/dev/null,从而将它丢弃

erdeng@rhce:/tmp/testing$ cd ..
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ ls -0 2>/dev/null ==>将错误信息重定向到/dev/null
erdeng@rhce:/tmp$ cat /dev/null
erdeng@rhce:/tmp$     ==>文件/dev/null为空 
>file 2>&1
&>file
重新定义stdoutstderr已覆盖同一文件
```c
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1  ==>创建文件test1
erdeng@rhce:/tmp/testing$ ls -0 >test1 2>&1  ==>重定向stderr错误信息覆盖
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
erdeng@rhce:/tmp/testing$ echo "Hello">test1 2>&1  ==>重定向stdout覆盖文件
erdeng@rhce:/tmp/testing$ cat test1
Hello
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1
erdeng@rhce:/tmp/testing$ ls -0 &>test1
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
erdeng@rhce:/tmp/testing$ echo "Hello" &>test1
erdeng@rhce:/tmp/testing$ cat test1
Hello
>>file 2>&1
&>>file
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1
erdeng@rhce:/tmp/testing$ ls -0 >>test1 2>&1  ==>添加到test1
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
erdeng@rhce:/tmp/testing$ echo "Hello" >>test1 2>&1 ==>"Hello"追加到test1中
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
Hello
erdeng@rhce:/tmp$ rm -r testing
erdeng@rhce:/tmp$ mkdir testing
erdeng@rhce:/tmp$ cd testing
erdeng@rhce:/tmp/testing$ touch test1
erdeng@rhce:/tmp/testing$ ls -0 &>>test1
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
erdeng@rhce:/tmp/testing$ echo "Hello" &>>test1
erdeng@rhce:/tmp/testing$ cat test1
ls: 不适用的选项 -- 0
请尝试执行 "ls --help" 来获取更多信息。
Hello

4.输入重定向

erdeng@rhce:/tmp$ cat <<EOF 
> hello
> EOF
hello

先在file中输入"hello",在用cat file输出其中内容

erdeng@rhce:/tmp/testing$ cat <<EOF > test1  ==>定向到test1中
> 123
> 456
> 678
> LOL
> EOF
erdeng@rhce:/tmp/testing$ cat test1
123
456
678
LOL

"<<EOF EOF"的作用是命令执行过程中用户自定义输入,起到临时文件的作用。

十.管道与tee

管道相当于单向的水管,用于输出
tee相当于多向的水管,用于输出同时重定向到文件中

root@rhce:/# ls -l |less|tee /tmp/output
总用量 945500 ==>以less分页显示
lrwxrwxrwx   1 root root         7 75 18:36 bin -> usr/bin
drwxr-xr-x   4 root root      4096 78 15:23 boot
drwxr-xr-x   2 root root      4096 75 18:38 cdrom
drwxr-xr-x  19 root root      4140 715 13:25 dev
drwxr-xr-x 131 root root     12288 715 15:10 etc
drwxr-xr-x   4 root root      4096 714 22:45 home
lrwxrwxrwx   1 root root         7 75 18:36 lib -> usr/lib
以上部分内容删去
root@rhce:/# cat /tmp/output ==>重定向到/tmp/output文件
总用量 945500
lrwxrwxrwx   1 root root         7 75 18:36 bin -> usr/bin
drwxr-xr-x   4 root root      4096 78 15:23 boot
drwxr-xr-x   2 root root      4096 75 18:38 cdrom
drwxr-xr-x  19 root root      4140 715 13:25 dev
drwxr-xr-x 131 root root     12288 715 15:10 etc
drwxr-xr-x   4 root root      4096 714 22:45 home
lrwxrwxrwx   1 root root         7 75 18:36 lib -> usr/lib
以上部分内容删去

十一.vim编译器

vim编译器有三种模式:
命令模式、编译模式、末行模式
三种模式的转换方法:
(1)命令模式下,输入:后进入末行模式
(2)末行模式下,按esc慢退,按两次esc快退、或者删除所有命令,可以回到命令模式
(3)命令模式:按下i、a 等键可以进入编译模式
(4)编译模式:按下esc,可以回到命令模式

1.一般命令模式

一般命令模式可用的功能有,光标移动、复制粘贴、查看替换
h 或左移键 光标向左移动一个字符
j 或右移键 光标向下移动一个字符
k 或上移键 光标向上移动一个字符
l 或下移键 光标向右移动一个字符
hjkl在同一行,左下上右。(坐下又对称==>上右)
想进行多行移动 30h 向左移动30个字符,30 k向上移动30行。
翻页操作
[Ctrl]+[f ] :屏幕向下翻一页,相当于[page Down] [d]翻半页
[Ctrl]+[b]:屏幕向上翻一页,相当于[page Up] [u]翻半页
光标移动
+:非空格下一行
-:非空格上一行
n :光标向后移动n位
0 或[home]:移动到这一行的最前面的字符处
$ 或[end] :移动到这一行的最后面的字符处
H :移动到这个屏幕第一行的第一个字符
M:移动到这个屏幕最中间行的第一字符
L:移动到这个屏幕最下方行的第一个字符
G:移动到这个文件的最后一行
nG :移动到文件的第n行
gg:移动到文件的第一行,相当于1G
n:光标下移n行
代替与替换
/ word :光标之下寻找一个名为word的字符串。
?word :在光标之上寻找名为word的字符串。
n1,n2s/word1/word2/g :n1,n2为数字,在n1和n2之间寻找word1,并将其替换成word2
1, s / w o r d 1 / w o r d 2 / g : 从第一行到最后一行的 w o r d 1 替换成 w o r d 21 , s/word1/word2/g :从第一行到最后一行的word1替换成word2 1, s/word1/word2/g:从第一行到最后一行的word1替换成word21,s/word1/word2/gc :从第一行到最后一行的word1替换成word2,并在替换前提醒用户确认是否需要替换
删除、复制与粘贴
x:向后删除一个字符
X:向前删除一个字符
nx:向后删除n个字符
dd:删除(剪切)光标所在的一整行
ndd:删除(剪切)光标下n行
d1G:删除(剪切)第一行
dG:删除(剪切)最后一行
d : 删除 ( 剪切 ) 光标到本行最后一个字符 d 0 : 删除 ( 剪切 ) 光标到本行第一个字符 y y : 复制当前行 n y y : 向下复制 n 行 y 1 G : 复制光标所在行到第一行的所有数据 y G : 复制光标所在行到最后一行的所有数据 y 0 :复制光标所在行,从光标所在位置到行首的数据 y :删除(剪切)光标到本行最后一个字符 d0:删除(剪切)光标到本行第一个字符 yy:复制当前行 nyy :向下复制n行 y1G:复制光标所在行到第一行的所有数据 yG:复制光标所在行到最后一行的所有数据 y0:复制光标所在行,从光标所在位置到行首的数据 y :删除(剪切)光标到本行最后一个字符d0:删除(剪切)光标到本行第一个字符yy:复制当前行nyy:向下复制ny1G:复制光标所在行到第一行的所有数据yG:复制光标所在行到最后一行的所有数据y0:复制光标所在行,从光标所在位置到行首的数据y:复制光标所在行,从光标所在位置到行尾的数据
p:将复制的数据在光标的下一行粘贴
P:将复制额数据在光标的上一行粘贴
J:将光标所在行与下一行数据合成同一行
c :重复删除多个数据,10c
u:恢复前一个操作
[Ctrl]+r :重做上一个操作
u与[Ctrl]+r:一个是恢复,一个是重做
. :一个点来重复前一个操作

2.编译模式

i 与I :i 在光标位置插入,I 在光标所在位置的第一个非空格符号处插入
a与A :a是在光标所在的下一个字符处插入,A是在光标所在行,行最后一个字符插入
o与O:o是插入光标所在的下一行插入,O是在光标所在的上一行插入
r与R:r是光标的字符进行一次替换,R会一直替换光标所在文字,直到按[Esc]
[Esc]:退出命令模式回到一般命令

3.命令模式

一般命令模式切换成命令行模式
:w 将编辑的数据写入硬盘文件中
:w! 若文件属性为[自读]时,强行写入该文件。不过,到底能不能写入,还根据你对文件的文件权限。
:q 退出
:q! 强行退出,若曾修改文件又不想保存,使用强行退出
:wq 退出后保存
:wq! 强制保存后退出
ZZ 文件没有修改,则不保存退出。若文件修改,则保存后退出
vim环境的修改
:set nu 显示行号,设置后,会在行的前缀显示行号
: set nonu 取消行号


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值