小白记录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         

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 :仅列出目录本身,而不列出目录内的文件数据

当我们去查询根目录下的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目录自己的权限、属性以及一些数据

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 (所有用户)经行加减。

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

总结

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值