linux基础学习--linux文件与目录管理
linux文件与目录管理
1. 目录与路径
1.1 相对路径与绝对路径
- 绝对路径:路径写法一定从根目录/写起。
- 绝对路径的正确度要高。
- 相对路径:路径写法不是由/写起。
1.2 目录的相关操作
切换目录的命令是cd
,下面是比较特殊的目录:
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表当前使用者身份所在的家目录
. 和 … 在所有目录下都会存在。甚至在根目录下也都存在,不过此时代表根目录上一层的(.)和根目录自己的(…)是同一个目录。
常见的处理目录的命令:
- cd:切换目录。
在Linux中, 一个用户的家目录就是/home/用户名/,root用户的家目录是/root/。使用~+用户名
表示对应用户的家目录。使用相对路径时,必须保证想去目录在当前目录下。 - pwd:显示当前目录。
pwd [-p]
,其中-p
表示显示出真正路径,而不是使用链接路径。 - mkdir:建立一个新目录。
mkdir [-mp]
:
[-m]
:设置文件的权限。
[-p]
:建立多层级目录时添加。 - rmdir:删除一个空目录。
rmdir [-p]
:-p
表示连同上一层的空目录也一并删除。
1.3执行文件路径的变量:$PATH
PATH就是环境变量,通常写作$PATH
,$表示后面接的是变量,这个变量由一堆目录所组成,每个目录中间由冒号(:)隔开,每个目录有顺序之分。我们所使用的命令,之所以可以仅仅输入命令名称就可以运行,是因为这些命令的文件所在的目录就在变量 $PATH中。一旦某个命令的文件被移 出 $PATH中记录的目录,那么无论在哪个目录输入这个命令的名称来执行它,都不能执行成功。
2.文件与目录管理
2.1 文件与目录的查看:ls
ls
命令是linux系统中相当常见的命令。
ls [指令] 文件名或目录名称
常见指令:
-a :全部的文件,连同隐藏文件(开头为.的文件)一起列出来。
-A :全部的文件,连同隐藏文件,但不包括.和..这两个目录。
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)。
-f :直接列出结果,而不进行排序(ls会默认以文件名排序)。
-F :根据文件,目录等信息,给予附加数据结构,例如:*:代表可执行文件; /:代表目录; =:代表socket文件; |:代表FIFO文件;
-h :将文件容量以人类较易读的方式(如GB,KB)列出来。
-i :列出inode号码,inode的意义下一章将会介绍。
-l :详细信息显示,包含文件的属性与权限等数据。
-n :列出UID与GID而非使用者与用户组的名称(UID与GID会在账号管理提到)。
-r :将排列结果反向输出。
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来。
-S :以文件容量大小排序,而不是用文件名排序。
-t :依时间排序,而不是用文件名。
--color=never :不要依据文件特性给予颜色显示。
--color=always :显示颜色。
--color=auto :让系统自行依据设置来判断是否给予颜色。
--full-time : 以完整时间模式(包含完整年,月,日,时,分)输出;
--time=(atime,ctime) : 输出access时间或改变权限属性时间(ctime),而非内容修改时间。
当只执行ls
时,默认显示的只有:非隐藏的文件的文件名,以文件名进行排序及文件名代表的颜色显示。
2.2 复制,删除与移动:cp,rm,mv
- cp(复制文件或目录)
当需要复制文件时,要使用cp
这个命令。这个命令除了复制,还可以建立链接文件,对比两文件的新旧而予以更新,以及复制整个目录。
移动目录和文件,使用mv
命令,这个命令也可以用来重命名。
删除,使用rm这个命令。 - cp(复制文件或目录)
cp [指令] 源文件 目标文件
cp [options] sourcel source2 source3 ... directory
-a :相当于-dr --preserve=all的意思。
-d :若源文件为链接文件的属性,则复制链接文件属性而非文件本身。
-f :为强制的意思,若目标文件已经存在且无法开启,则删除后再尝试一次。
-i :若目标文件已经存在时,在覆盖时会先询问操作的进行(常用)。
-l :进行硬链接的链接文件建立。
-p :连同文件的属性(权限,用户,时间)一起复制过去,而不是使用默认。
-r :递归复制,用于目录的复制操作;
-s :复制成为符号链接文件,即"快捷方式"文件。
-u :destination比source旧才更新description,或description不存在的情况下才复制。
--preserve=all :除了-p的权限相关参数外,还加入了SELinux的属性,links,xattr等也复制。
对于不同的身份者,执行这个命令会有不同的结果产生,尤其是-a
和-p
的选项,对于不同的身份来说,差异特别大。
而在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常是命令操作者本身。
因此,在使用cp
命令复制一些特殊权限文件时,把你直接使用cp进行复制,必须加上-a或者-p完整复制权限。
- rm(删除文件或目录)
rm [-fir] 文件或目录
-f :就是froce的意思,忽略不存在的文件,不会出现警告信息。
-i :交互模式,在删除前会询问使用者是否操作。
-r :递归删除,最常用于目录的删除,这个选项相当危险。
在linux系统下,为了避免文件被删除,很多Linux发行版中已经默认加入了-i
这个选项。
- mv(移动文件与目录,或者重命名)
mv [-fiu] source destination
mv [option] source1 source2 source3 ... directory
-f :foece强制的意思,如果目标文件已经存在,不会询问而是直接覆盖。
-i :若目标文件已经存在时,就会询问是否覆盖。
-u :若目标文件已经存在,且source比较新,才会更新。
2.3获取路径的文件名与目录名称
- basename获取文件名
basename + 路径
返回最后的文件名。 - dirname获取目录名
dirname + 路径
返回路径中的目录名。
3.文件内容查看
常见的显示文件内容的命令有cat,more,less。此外还有tail,tac。
- cat 由第一行开始显示文件内容。
- tac 从最后一行开始显示,可以看出tac时cat的倒着写。
- nl 显示的时候,同时输出行号。
- more 一页一页地显示文件内容。
- less 与more相似,但比more更好,可以往前翻页。
- head 只看前面几行。
- tail 只看后面几行。
- od 以二进制的方式读取文件内容。
3.1 直接查看文件内容
直接查看一个文件的内容可以使用cat
/tac
/nl
这些命令:
- cat
cat [-AbEnTv] 文件名
-A :相当于-vET的整合选项,可列出一些特殊字符而不是空白而已。
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号。
-E :将结尾的换行符$显示出来。
-n :打印出行号,连同空白行也会有行号,与-b的选项不同。
-T :将[tab]按键以^I显示出来。
-v :列出一些看不出来的特殊字符。
cat
命令查看一些较小文件还有,文件行数过大时根本来不及查看结果。
- tac(反向列示)
tac
命令与cat
命令基本相同,只是cat是从第一行输出到最后一行,tac是从最后一行输出到第一行。 - nl(添加行号打印)
nl [-bnw] 文件
-b :指定行号指定的方式,主要有两种:-b a :表示不论是否为空行,也同样列出行号。-b t :如果有空行,空的那一行就不要列出行号。
-n :列出行号表示的方法有三种:-n ln :行号在屏幕的最左方显示。-n rn :行号在自己栏位的最右方显示,且不加0。-n rz :行号在自己栏位的最右方显示,且加0。
-w :行号栏位的占用的字符数。
nl
与cat -n
类似,但它可以做更多的显示设计。
3.2 可翻页查看
前面的命令都是一口气把所有数据都显示出来,而more
和less
可以进行分页显示。
- more(一页一页翻动)
more 文件
如果more后文件的行数大于屏幕输出的行数时,会在最后一行显示出目前显示的百分比,还可以在最后一行输入一些有用的命令。
空格键(space):代表向下翻一页。
Enter :代表向下翻一行。
/字符串:代表在这个显示的内容当中,向下查找字符串这个关键词。
:f :立刻显示出文件名以及目前显示的行数。
q :代表立刻离开more,不再显示该文件内容。
b或[ctrl]-b :代表往回翻页,不过这操作只对文件有用,对管道无用。
- less(一页一页翻动)
less的用法更加灵活,在more中我们并没有办法往前翻,只能向后,如果使用了less,就可以使用【pageup】【pagedown】等按键的功能来往前往后翻看文件。除此之外,还有许多的查找功能。
空格键:向下翻动一页。
[pagedown]:向下翻动一页。
[pageup]:向上翻动一页。
/字符串:向上查找字符串的功能。
?字符串:向上查找字符串的功能。
n:重复前一个查找(与/或?有关)。
N:反向的重复前一个的查找(与/或?有关)。
g:前进到这个数据的的第一行。
G:前进到这个数据的最后一行去(注意大小写)。
q:离开less这个程序。
3.3 数据截取
我们可以对输出的数据进行一个简单的截取,就是取出文件前面几行(head)或者取出后面几行(tail)文字的功能,不过都是以“行”为单位进行数据截取的。
- head(取出前面几行)
head [-n number] 文件
-n :后面接数字,代表几行的意思。
不加-n
时默认只显示十行,如果数字m前加-时,就是输出前面的所有行数,只留最后m行。
- tail(取出后面几行)
tail [-n number] 文件
-n :后面接数字,代表几行的意思。
-f :表示后面持续刷新显示后面所接文件中的内容,直到按下[ctrl]-c才会结束。
用法与head类似,不过当数字m前加+时,就表示从第m行开始输出后面所有的内容。
3.4 非纯文本文件:od
以上命令都是查看纯文本文件时使用的,使用它们读取非文本文件时会输出乱码,而执行文件通常是二进制文件,伺此时可以使用od
这个命令读取。
od [-t TYPE] 文件
-t :后面可以跟各种【类型(TYPE)】的输出,例如:a :利用默认的字符来输出。c :使用ASCII字符进行输出。d[size] :利用十进制来输出数据,每个整数占用size Bytes。f[size] :利用浮点数值来输出数据,每个整数占用size Bytes。o[size] :利用八进制来输出数据,每个整数占用size Bytes。x[size] :利用十六进制来输出数据,每个整数占用size Bytes。
3.5 修改文件创建时间或创建新文件:touch
在每个文件下都会记录许多的时间参数,其实是有三个主要的变动时间:
- 修改时间(mtime)
- 当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或者权限。
- 状态时间(ctime)
- 当文件的【状态】改变时,就会更新这个时间,举例来说,像是权限和属性被更改了,都会更新这个时间。
- 读取时间(atime)
- 当【该文件的内容被读取】时,就会更新这个时间,举例来说,我们使用cat去读取一个文件时,该文件简单atime。
默认情况下,ls显示出的时间是该文件的mtime,也就是这个文件上次被修改的时间。可以使用touch
来修改时间。
touch [-acdmt] 文件
- 当【该文件的内容被读取】时,就会更新这个时间,举例来说,我们使用cat去读取一个文件时,该文件简单atime。
-a :仅自定义atime。
-c :仅修改文件的时间,若文件不存在则建立新文件。
-d :后面可以接欲自定义的日期而不用目前的日期,也可以使用--data="日期或时间"。
-m :仅可修改mtime。
-t :后面可以接欲自定义的时间而不用目前的时间,格式为[YYYYMMDDhhmm]。
默认情况下,touch直接接文件,这个文件的三个时间(atime/ctime/mtimew)都会更新为目前的时间。若该文件不存在,就会主动建立一个新的空文件。
touch最常用的就是:
- 建立一个空文件。
- 将某个文件日期自定义为目前(mtime与atime)。
4.文件与目录的默认权限与隐藏权限
在Linux中除了r,w,x等属性外,在Linux传统的ext2,ext3,ext4文件系统下,还可用设置其他的隐藏属性,可以用chattr
设置,以lstar
查看,最重要的属性就是设置其不可修改的特性,让连文件的拥有者都不能进行修改。但在centos7中使用xf作为默认文件系统,xfs仅支持chattr的部分参数。
4.1文件的默认权限:umask
umask就是指目前用户在建立文件或目录时的权限默认值。查看umask的方法有两种:
- 直接输入umask,就可以看到数字类型的权限设置值。
- 输入umask -S,以符号类型的方式来显示权限。
在默认权限的属性上,目录与文件是不一样的。
对于文件,一般是用来记录数据的,执行的权限并不必要,那么就只有rw这两个权限,也就是说最大为666,如下:
-rw-rw-rw-
对于目录,由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即777,如下:
drwxrwxrwx
umask指的是该默认值需要减掉的权限,r,w,x对应4,2,1,对应的数字表示减掉对应权限。
需要设置umask时,直接umask + 数字
就可以更改默认权限了。
4.2文件隐藏属性
以下的chattr命令只在ext2,ext3,ext4的传统文件系统上完整生效。
- chattr(配置文件隐藏属性)
chattr [+-=] [ASacdistu] 文件或目录名称
+ :增加某一个特殊参数,其他原本存在的参数则不动。
- :删除某一个特殊参数,其他原本存在的参数则不动。
= :直接设置参数,且仅有后面接的参数。
A :当直接设置A这个属性时,若你在存取此文件时,它的存取时间将不会被修改,可避免I/O较慢的机器过度的读写磁盘。
S :一般文件是非同步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该修改会同步写入磁盘中。
a :当设置a之后,这个文件将只能增加数据,而不能删除或修改数据,只有root用户才能设置这属性。
c :这个属性设置之后,将会自动的将此文件【压缩】,在读取的时候会自动的解压缩。
d :当dump程序被执行时,设置d属性将可使该文件(或目录)不会被dump备份。
i :可以让一个文件【不能被删除,改名设置链接也无法写入或新增数据】只有root可以设置此属性。
s :当文件设置了s属性,如果该文件被删除,它将完全从硬盘被删除,如果误删将完全无法被恢复。
u :与s相反,当使用u来配置文件时,如果该文件被删除,则数据内容其实还存在与磁盘中,可以用来恢复该文件。
- lsattr(显示文件隐藏属性)
lsattr [-adR] 文件或目录
-a :将隐藏文件的属性也显示出来。
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名。
-R :连同子目录的数据也一并列出来。
4.3 文件的特殊权限:2025-04-21 07:08,SGID,SBIT
-
Set UID
当s这个标志出现在文件拥有者的x权限上时,被称为Set UID,简称为SUID的特殊权限,它有着这样的限制和功能: -
SUID权限仅对二进制程序有效。
-
执行者对于该程序需要有x的可执行权限。
-
本权限仅在执行该程序的过程中有效。
-
执行者将具有该程序拥有者的权限。
总得来说,执行者需要对这个二进制文件有x权限,执行该文件时,会暂时获得这个文件拥有者的权限。
SUID就可以用在二进制文件上,不能用在shell脚本上。 -
Set GID
当s标志出现在用户组的x时则被称为Set GID,与SUID不同,SGID可以针对文件或目录进行设置,对文件来说,SGID有如下功能: -
SGID对二进制有用。
-
程序执行者对于该程序来说具有x权限。
-
执行者在执行过程中将会该程序用户组的支持。
与SUID相似,执行者需要对该文件有x权限,执行该文件时,会暂时获得这个文件用户组的权限。
SGID也可以对目录作用,当一个目录设置SGID的权限后,就会有如下的权限: -
用户如果对此目录具有r和x权限,该用户能够进入此目录。
-
用户在此目录下的有效用户组将会变成该目录的用户组。
-
用途:若该用户在此目录下拥有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同。
-
Sticky Bit
SBIT目前只针对目录有效,对文件无效果,对目录的作用是: -
当用户对于此目录具有w,x权限,即具有写入的权限。
-
当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。
-
SUID/SGID/SBIT权限设置
可以使用数字修改权限的方式修改,在原来的三个数字前再加一位数字:
特殊权限 | 数值 | 含义 |
---|---|---|
SUID | 4 | 程序运行时以文件拥有者的身份执行(常用于可执行文件) |
SGID | 2 | 程序以文件所属组身份执行 / 目录中新建文件继承所属组 |
Sticky Bit | 1 | 常用于目录,只有文件拥有者或 root 能删除该目录下的文件 |
- 注意,这三个权限的s和t是取代x权限的,当使用ls命令进行查询时,s或t会直接取代x来显示。而当无x权限,会变成大写的X和S。
SUID,SGID,SBIT 分别绑定在 user/group/other的x权限上,当拥有这些隐藏权限时,x就会被替换。
4.4 观察文件类型:file
file
命令,可以用来查看某个文件的基本信息,如是属于ASCII或是数据文件或是二进制文件,且,其中有没有用到动态链接库等信息。
用法:file 文件
。
5.命令与文件的查找
5.1 脚本文件的查找
- which(查找【执行文件】)
which [-a] command
-a :将所有由PATH目录中可以找到的命令均列出,而不止第一个被找到的命令名称。
这个命令是根据【PATH】这个环境变量所规范的路径,去查看执行文件的文件名。
5.2 文件的查找
在Linux中,一般不常用find命令来查找,不仅速度很慢,也影响硬盘性能。
一般先使用whereis
locate
来查找,whereis
只找系统中某些特定目录下面的文件,locate
则是则是利用数据库来查找文件名。
- whereis(由一些特定的目录中查找文件)
whereis [-bmsu] 文件或目录名
-l :可以列出whereis会去查询的几个主要的目录。
-b :只找binary(二进制)格式的文件。
-m :只找在说明文件manual路径下的文件。
-s :只找source源文件。
-u :查找不在上述三个项目当中的其他特殊文件。
locate/updatedb
locate [-ir] keyword
-i :忽略大小写的差异。
-c :不输出文件名,仅计算找到的文件数量。
-l :仅输出几行的意思,例如输出五行则是-l 5。
-S :输出locate所使用的数据库文件的相关信息,包括数据库记录的文件/目录数量等。
-r :后面可接正则表达式的显示方式。
locate查询的速度相当快速,因为它是通过已建立的数据库查询的,不需要去硬盘中读取数据。
而CentOS 7中数据库是每天一更新的,这就导致在数据库更新前新建的文件会查询不到,此时可以使用updatadb
来手动更新数据库。
- find
find [PATH] [option] [ation]
1.与时间有关的参数:-atime,-ctime与-mtime。
-mtine n :n为数字,意义为在n天之前的【一天之内】被修改过内容的文件。
-mtine +n :列出在n天之前被修改过内容的文件。
-mtine -n :列出在n天之内被修改过内容的文件。
-newer file :file为一个实际存在的文件,列出比file还新的文件。
- +n :代表大于等于n天前的文件。
- -n :代表小于等于n天前的文件。
- n :是代表n到n+1那天的文件。
2.与使用者或用户组名称有关的参数:
-uid n :n为数字,这个数字是使用者的账号ID,即UID,记录在/etc/passwd里面。
-gid n :n为数字,这个数字是用户组名称的ID,即GID,记录在/etc/group中。
-user name :name为使用者账号名称。
-group name :name为用户组名称。
-nouser :查找文件的拥有者不在/etc/passwd中。
-nogroup :查找文件的拥有用户组不存在于/etc/group的文件,当你自行安装软件时,很可能该软件的属性中并没有文件拥有者。
当系统中的某个账号被删除,但是该账号中存储了很多文件时,很可能就会产生无主文件,就要使用-nouser来查找该类型的文件。
3.与文件权限及名称有关的参数:
-name filename :查找文件名称为file的文件。
-size [+-]SIZE :查找比SIZE还要大或者小的文件,这个SIZE的规格有:c:代表Bytes,k:代表1024Bytes。
-type TYPE :查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),scoket(s),及FIFO(p)等属性。
-perm mode :查找文件权限【刚好等于】mode的文件,这个mode为类似chmod的属性值,即4755这类。
-perm -mode :查找文件权限【必须要囊括mode的权限】的文件,例如查询0744的文件,4755的文件也会被列出,因为4755已经囊括0744了。
-perm/mode :查找文件权限【包含任一mode的权限】的文件。
4.额外可进行的操作
-exec command :command为其他命令,-exec后面可以在接额外的命令来处理查找到的结果。
-print :将结果打印到屏幕上,这个操作时默认操作。
举个例子find /usr/bin /usr/sbin -perm /7000 -exec ls -l () \;
- {}代表的是由find找到的内容,这些结果会被放到{}中。
- -exec到;是关键词,代表find额外操作的开始(-esec)到结束(;),这中间的就是find命令的额外操作。
- ;在bash环境下有特殊意义,因此使用反斜杠\来转义。
另外,find命令还可以通过通配符来查询文件名,例如,想要查找/etc目录下文件名包含http的文件,就可以:
find /etc -name '*http*'