彻底掌握Linux文件与目录管理命令?进来看看硬核总结

1.目录与路径
       
从根目录开始显示当前目录pwd
       
创建目录mkdir
       
删除目录rmdir
       
关于执行文件路径的变量:$PARH
2.文件与目录管理
       
复制文件 cp
       
移动目录mv
       
删除文件和目录rm
       
获取路径的文件名和路径名
3.文件的查看
       
cat,tac,nl查看文件
       
more和less查看文件
       
head和tail查看文件
       
od查看文件
4.文件的其他操作
       
touch修改文件时间和创建文件
       
文件的默认权限
       
文件的隐藏属性
       
文件的特殊权限SUID,SGID,SBIT
       
观察文件类型
5.命令与文件的查找
       
脚本文件的查找which
       
文件的查找whereis
       
文件的查找locate/updatedb
       
文件的查找find
6.文件的软硬链接

1.目录的相关操作

1.1从根目录开始显示当前目录

命令:

pwd

1.2创建目录

1.mkdir [目录名]:创建一个目录名
2.mkdir -p [目录名/子目录/孙子目录]:递归创建目录
3.mkdir -m [数字1数字2数字3] [目录名] :在创建目录的同时设置权限
4.mkdir {目录1,目录2}:这里的大括号也要带上,表示在当前目录下同时建立几个目录

例子 :我们创建一个文件拥有者的,所属组,和其他人都能读写执行的a.txt文件
在这里插入图片描述
我们在a.txt下创建aa,bb,cc三个目录
在这里插入图片描述

1.3删除目录

1.rmdir [目录名]:删除指定的目录
2.rmdir [-p] [目录名/子目录/孙子目录]:递归删除目录

注意:

rmdir删除的只能是空的目录

比如我们删除多层目录rmdir -p aa/bb/cc,如果aa目录不仅有bb目录还有一个文件,bb目录里只有cc这一个目录,cc是一个空目录,那么只有bb和cc目录,aa不会被删除

1.4关于执行文件路径的变量:$PARH

在linux中我们使用命令都要指定路径,比如我们使用ls,指明路径其实就是 /bin/ls
在这里插入图片描述
那么我们为啥用的时候直接输入ls就行了呢,那是因为我们在没指定命令所在路径的时候,系统会在指定的默认路径去找,找到了就执行,找不到就报错

那么默认路径是啥呢,可以用下面的指令查看:

echo $PATH

在这里插入图片描述

我们的echo是打印的意思,$代表后边的是变量,PATH才是系统的默认的路径变量,PATH不是只有一个路径,是指多个路径的和,路径之间用:隔开

2.文件与目录的管理

2.1复制文件

cp [需要复制的文件] [复制后文件的去向]

举个例子: cp aa/bb cc/dd
这个指令分为两种情况:
1.第一种情况是dd是一个目录,那么这个命令的意思是把bb文件拷贝到目录dd中
2.如果dd不存在那么我们把bb复制到cc目录下并改名为dd,要是dd是一个已存在的文件,那么就把bb复制到cc目录下改名并覆盖原来的dd文件

注意这个命令我们只能拷贝文件,并不能拷贝目录,Linux目录也是文件

如果我们想拷贝一个目录的话使用如下指令

cp -rf [需要复制的文件] [复制后文件的去向]

这里就牵扯到cp的参数选项

参数 意思
-p 连同文件的属性(包括权限,创建时间等)一起拷贝过来
-r 递归拷贝(用于目录)
-f 表示强制性
-i 若目标文件已经存在那么系统会通过询问来确定是否覆盖
-d 若源文件为链接属性那么拷贝的是链接文件,不是链接指定的文件(如果直接拷贝链接属性的文件那么拷贝的是链接指定文件)
-a 把所有的参数选项都加进去
2.2移动文件

mv [参数] 文件名1 文件名2

如果文件1是文本文件,文件2是一个目录,且文件2下是有一个文本文件和文件1重名,那么移动的时候是覆盖,如果文件2下的目录名和要移动的文本文件名一样那么会报错,因为文本文件不能覆盖目录

参数

参数名 作用
-f 强制执行,如果文件2已经存在那么不经过提示直接覆盖
-i 若文件2已经存在那么系统会提示是否覆盖
-u 若文件2已经存在且文件1比较新才会更新

mv还可以只用于重命名

mv [需要改名的文件] [新名字]

2.3删除文件或者目录

rm [-fir] 文件

参数 作用
-f 强制执行,忽略不存在的文件,不出现警告信息
-i 人机交互,询问使用者是否进行该操作
-r 递归删除

rm不能直接删除目录,我们可以使用-r删除

我们将一个通配符*
rm a*:意思是把只有是以a开头的文件全部删除

2.4获取路径的文件名和路径名

basename 一个路径:获得最后的文件名
dirname 一个路径:获得目录

比如:
1.basename /etc/aa/bb:得到得是bb
2.dirname /etc/aa/bb:得到得是/etc/aa

3.查看文件

3.1cat,tac,nl查看文件

cat [文件名]

cat在如果文本内容很多的话,那么只会在终端显示最后一部分终端最多所能显示的内容,所以cat只能查看文本内容较少的文件

cat -n [文件名]:会在显示文件内容的时候把每一行加上编号

tac和cat的查看顺序相反tac是从尾到头查看文件,其他的都一样

1.tac [文件名]
2.tac -n [文件名]

nl就更简单下面的命令和作用和cat -n [文件名] 一样

nl [文件名]

3.2more和less查看文件

more [文件]:一页一页或一行一行的往后看

more搭配的按键

按键 作用
空格 代表翻页
回车 代表下一行
/+字符串 查找字符串

缺点:more是从前往后翻,不能从后往前翻
但是less就完美的解决了这个问题

less [文件]:回车和空格效果和more一样,

less搭配的按键

按键 作用
空格 代表翻页
回车 代表下一行
/+字符串 查找字符串
pageup 向上翻页
pagedown 向下翻页
3.3head和tail查看文件

head [文件]:默认查看前十行
tail [文件]:默认查看尾十行

还可以

1.head -n 数字 [文件]
2.head -数字 [文件]
1.tail -n 数字 [文件]
2.tail -数字 [文件]
两种都可以查看数字指定的行数,只不过head是从头查看指定行数,tail是从尾部向头查看指定行数

3.4od查看文件

od [-t TYPE] [文件] :查看二进制文件

TYPE的类型

类型 作用
a 默认的字符来输出
c 使用ASCII字符来输出
d 使用十进制输出数据
f 利用浮点数值来输出数值
o 利用八进制输出数据
x 利用十六进制输出数据

比如我们查看bin命令
在这里插入图片描述

4.文件的其他操作

4.1touch修改文件时间和创建文件

1.touch [文件名]:如果文件名所代表的文件不存在,那就创建出一个新的文件,如果存在那么修改文件的创建时间或者访问时间为现在
2.touch -c [文件名]:参数c代表仅修改文件时间,如果文件不存在那么不创建新的文件
3.touch -t [YYYYMMDDhhm] [文件名]:-t代表直接按照格式修改文件的创建或者访问时间

4.2文件的默认权限umask

我们创建一个新的文件的时候,它的权限是怎样的呢?那么这个时候就与我们的默认权限有关,我们可以用umask来查看

1.umask:以数字的形式,默认的权限只与后三个数字有关
2.umask -S:以字母的形式详细显示所有人的默认权限

举例:
在这里插入图片描述
但是我们创建文本文件和目录的默认权限是不同的,用户创建文本文件默认是文件创建者没有可执行权限,即最多只能是rw-rw-rw-然而目录默认的最大权限却是rwxrwxrwx

再看umask命令后三个数字002,这个意思是在最大权限的基础上文件拥有者权限减去0,那么还是rw,文件所属组在最大权限的基础上也减去0,还是,其他人对应得数字是2,那么就是在默认的最大权限的基础上减去2那么就只有r了,我们举个例子(ll=ls -l

在这里插入图片描述
我们可以看到新创建的文本文件权限是rw-rw-r- - 当然我们创建目录的默认权限将会是rwxrwxr-x

我们注意我们每一个人的umask不一定都一致,这个只是博主自己的默认权限

当然我们还可以设置默认权限

umask 数字1数字2数字3

举例:
在这里插入图片描述

4.3文件的隐藏属性

你可能会觉得卧槽还有隐藏属性,然后你就想找设计者单挑
在这里插入图片描述
当然了,你还是要学的

chattr [+-=] [Aacdistu] 文件或目录

参数与选项:

参数与选项 作用
+ 增加某一个特殊参数,其他原本存在参数则不动
- 移除某一个特殊参数,其他原本存在参数则不动
= 设定一个参数,且仅有后面接的参数
A 当设定了A 这个属性时,若你有存取此档案(或目录)时,他的存取时间atime 将不会被修改,可避免I/O 较慢的机器过度的存取磁盘。(目前建议使用档案系统挂载参数处理这个项目)
a 当设定a 之后,这个档案将只能增加资料,而不能删除也不能修改资料,只有root 才能设定这属性
c 这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
d 当dump 程序被执行的时候,设定d 属性将可使该档案(或目录)不会被dump 备份
i 这个i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增资料!』 对于系统安全性有相当大的助益!只有root 能设定此属性
s 当档案设定了s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
u 与s 相反的,当使用u 来设定档案时,如果该档案被删除了,则资料内容其实还存在磁盘中,可以使用来恢复该档案喔!

我们举个例子:
在这里插入图片描述
我们可以看到
使用这个命令我们需要切换成root用户,然后由于加了i隐藏权限所以即使输入y也不会把他删除

当然我们可以显示文件隐藏属性
lsattr [-adR] 文件或目录

参数 作用
-a 隐藏文件的属性也显示出来(这个时候就不用加文件或者目录名了)
-d 如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R 连同子目录一并列出来

我们拿上边的aa举例子
在这里插入图片描述

4.4文件的特殊权限SUID,SGID,SBIT

我们查看两个文件的权限:
在这里插入图片描述
我们发现passwd里的文件拥有者里有一个s权限,我们把在文件拥有者里有s权限称为SUID权限,那么它的功****能和限制如下

  • 1.SUID 权限仅对二进制程序(binary program)有效;
  • 2.执行者对于该程序具有x 的可执行权限;
  • 3.本权限仅在执行该程序的过程中有效(run-time);
  • 4.执行者将具有该程序拥有者(owner) 的权限。

其实有点不好懂,没关系我们举个例子:
我们查看两个文件的权限一个是shadow另一个是passwd
在这里插入图片描述
shadow的文件拥有者是root,root作为万能的神即使我们查看的shadow权限里文件拥有者没有任何权限,但是root还是能对它进行读写执行的操作的,shadow里边存的是我们的账户和密码,那么我们能否以普通用户的身份去更改shadow里边的内容呢,我们知道passwd是是我们修改密码的指令,那么普通用户能否用passwd来更改我们的密码呢,这里博主经过尝试发现是可以的.卧槽这是nm什么操作
在这里插入图片描述
我们发现passwd里边的拥有者是root,而且在文件拥有者的权限里有s,那么根据SUID的第四点功能来看,我们的普通用户是执行者,这个时候有文件拥有者(root)的权限了,而且我们的普通用户对passwd有可执行权限(SUID的第二点限制),那么也就是说此时的普通用户在passwd的加持下在修该密码的层面变成了万能的神(root),所以就可以对里边的内容进行更改。对比来看,我们普通用户不能使用cat查看shadow,因为cat的文件拥有者不具有s这一权限,所以在cat的加持下,普通用户依旧是一条咸鱼
在这里插入图片描述
我们把在文件拥有组里有s权限称为SGID权限,还有一点和SUID不同,那就是SUID只是对二进制程序有效而SGID对文件目录都有用,对文件有用时SGID的功能是:

  • 1.SGID对二进制有用
  • 2.程序执行者对于该程序来说具备x权限
  • 3.执行者在执行的过程中该程序用户组的支持

同样的我们举一个例子:
在这里插入图片描述
分析一下,我们看得出来我们的普通用户对locate是有执行权限的,此时locate的用户所有组是有s权限的,那么我们的普通用户就会取得loacte所有组(slocate)的支持,我们普通用户(就是所谓的执行者)现在的权限相当于slocate,那么对于slocate来说是对mlocate.db是有可读权限的,所以就能够顺利的读出来
在这里插入图片描述

作用在目录的时候功能为:
看下面一张图:

在这里插入图片描述
我们可以看到aa的所属组为root,博主在没给aa的组赋予s权限的时候在aa下创建一个目录bb,我们可以发现bb所属的组为默认的当前用户所属的组也就是master,当博主给group赋予s权限后再建立权限的时候,再在aa下创建一个目录cc发现所属的组为root。其实当我们给一个目录赋予s权限的时候,创建的子目录或者文件所属的组默认和这个目录一样,类似于继承
在这里插入图片描述
在这里插入图片描述

上图有特殊的t权限,被称为SBIT,值得注意的是这个权限只针对目录有效,而且只能是其他人上边的权限
它的作用是,当一个目录拥有该权限的时候,里边的文件除了文件拥有者和root其他的都不能删除,即使别人有权限删除也不行

最后我们这里将讲一下如何设置上面三种特殊的权限,我们只需要在我们正常设置权限的三个数字之前再加上对应的数字即可

权限 代表数字
SUID 4
SGID 2
SBIT 1

举个例子;

在这里插入图片描述
当然上图我们也可以:

chmod u+s aa

4.5观察文件类型

file [文件名]

5.命令与文件的查找

5.1脚本文件的查找

whitch [-a] [查找执行文件]:加上-a时就是将PATH目录下的所有可以找到的同名执行文件都列出来,否则只是显示找到的第一个

我们注意which是默认在PATH路径下寻找,比如history不在PATH中,所以which history查找不到,一定注意只能用来查找在PATH路径下的指令

比如:
在这里插入图片描述
可以看到alias ls后边跟的是ls的别名,也就是说我们平时执行的ls,系统就默认给我们执行它的别名

5.2文件的查找whereis

whereis [-bm] 文件或者目录名

参数:

参数 作用
-b 只查找二进制文件
-m 只查找帮助文档

我们不加参数的时候直接查找的是二进制文件和帮助文档,whereis是在几个特定的目录下进行查找,可以用whereis -l来查看where会在那些目录下查找

5.3文件的查找locate/updatedb

1.locate 文件:直接查找
2.locate -i 文件:忽略大小写查找

locate是在已经创建的数据库中查找,所以不用在硬盘里读取数据,和上面两个命令不同的是,它可以查找我们的普通文件

但是如果你要查找刚刚创建的文件的时候,有可能查找不到,这是因为我们刚刚创建的文件还没更新到数据库库里边,centos7默认是每天自动更新一次,所以要想手动更新数据库需要输入指令:

updatedb:必须在root权限下更新

5.4文件的查找find

find [目录] [属性] [值]

对指令各部分的解释:
1.目录:这里的目录如果是我们指定的,那么就在我们指定的目录下查找,否则就默认在当前目录下查找
2.属性:就是我们根据根据什么来查找,文件名或者文件大小或者文件的拥有者等等
3.属性值:当我们属性为文件大小时,属性值可以是10M等,其他属性以此类推

我们按文件名进行查找

find [查找的目录] -name [查找的文件]
find [查找的目录] -iname [查找的文件]:加上了-i意思是忽略大小写

按文件拥有者或拥有组进行查找:

find [查找的目录] -user [用户名]
find [查找的目录] -group [组名]

举个特殊的例子,我们在当前目录下查找文件拥有者为master,文件所属组为root的文件:

find -user master -group root

我们如果查找文件拥有者为master或者为root的文件:

find -user master -or -user root

我们还可以根据文件大小查找:

find [查找的目录] -size [+-][数字和单位]

例如:

find [查找的目录] -size +10k( k小写,兆是大写M):查找大于10k的文件
find [查找的目录 ] -size +10M -size -100M:查找大于10M小于100M的文件

根据时间来查找:

find [查找的目录] -ctime [+-][数字]

这里有一点和按文件大小不同;

1.find -ctime +2:列出在本目录下创建时间大于2天的文件
2…find -ctime -2:列出在本目录下创建时间小于2天的文件
3…find -ctime 2:列出在本目录下创建正好一天的文件

根据权限来查找

find [查找的目录] -perm [+-][数字]

举几个例子

1.find -perm +222:意思是只要文件拥有者或文件所属组或其他人只要有一个有w权限那么就匹配
2.find -perm -222:意思是文件拥有者或文件所属组或其他人都有w权限才会匹配
3.find -perm 222:意思是文件拥有者或文件所属组或其他人都必须只有w权限才会匹配
4…find -perm 2:意思是其他人必须只有w权限才会匹配
.find -perm 22:意思是文件所属组和其他人必须只有w权限才会匹配

6.文件的软硬链接

软硬链接:软链接相当于创建快捷方式,就是指向某一个文件,指向的目标文件如果被修改,那么指向这个文件的软链文件(既然是指向)那么打开后还是会和目标文件一样,而且还有一点那就是软链接的默认权限是lrwxrwxrwx硬链接相当于创建一个文件然后地址和传入的文件指向同一块内存。二者的区别:随着源文件被删除,由软链接创建的文件此时没有了指向自然就会失去作用,但是硬链接随着源文件的删除,还是指向那一块地址,内容不变。当一个文件的硬链接全部被删除那么这块内存就会被linux认为是空闲内存,再创建新的文件就会覆盖掉原有的数据

那么软硬链接的创建方式:

1.ln -s [需要创建软连接的文件] [文件的软链接名]:相当于文件的快捷方式
2.ln [需要创建软连接的文件] [文件的硬链接名]:相当C语言的指针,创建一个文件然后指向文件1的在磁盘上的位置

硬链接和软链接的识别方式:

1.通过i结点
2.看是否能跨分区
3.能否针对目录使用

对于i节点的解释,我们的每一个目录和文件都有一个特定的inode值,相当于每一个文件或者目录的身份证,都是最独一无二的,那么如何通过这个节点来区别呢?查看一个文件或者目录的i节点的值可以用ls -i +文件名
cc文件是aa的硬链接,bb是cc的软链接,我么分别查看他们三个的i节点:
在这里插入图片描述
我们可以看到软链接的i节点值和aa不同,但是硬链接的结点值和aa相同

2.我们的源文件如果在一个某一个盘,那么硬链接必须也要在这一个盘,然而软链接则不需要
3.不能给目录创建软链接,但是可以给目录创建一个软链接

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/106239158