第6章 Linux文件与目录管理
一、要点总结
6.1 目录与路径
6.1.1 相对路径和绝对路径
- 绝对路径:由根目录
/
写起。一般正确度更好。 - 相对路径:不由根目录写起。有利于程序安装在不同的目录之下。
6.1.2 目录相关操作
-
特殊的目录
.
:代表此层目录..
:代表上一层目录-
:代表到达过的上一个工作目录~
:代表目前使用者的家目录~account
:代表account用户的家目录
-
常见的处理目录的命令
-
cd
:切换目录 Change Directory1
2cd [相对路径、绝对路径或特殊目录] # 切换到特定目录
cd # 单独的cd代表回到使用者家目录 -
pwd
:显示当前工作目录 Print Working Directory1
2
3pwd [-R]
# 选项与参数:
# -P : 显示出真正的路径,而非使用链接(link)路径。 -
mkdir
:建立一个新目录 Make Directory1
2
3
4mkdir [-mp] 目录名称
# 选项与参数:
# -m : 直接设置文件的权限,后跟权限值,不适用默认的umask权限
# -p : 递归创建需要的目录(默认情况下是需要一层一层建立的)。 -
rmdir
:删除一个空目录- 空目录指的是里面不存在其他目录或文件的目录
1
2
3rmdir [-p] 目录名称
# 选项与参数:
# -p : 递归删除上层的空目录- 非空目录的删除可以使用
rm -r 目录名称
-
6.1.3 关于执行文件路径的变量:$PATH
-
用户能使用的命令是根据
PATH
变量所规定的目录去查找。- 系统会依照
PATH
的设置去每个PATH
里的目录下查找对应的可执行文件,如果有多个同名,那么先查找到的同名命令先被执行,因此通过路径指定可执行文件会比通过PATH
来执行来得正确。
- 系统会依照
-
不同身份用户默认的
PATH
不同,默认能随意执行的命令也不同(如root和dmtsai)。1
echo $PATH
输入上述命令后可以看到当前用户的
PATH
。它由一堆目录组成,每个目录中间用冒号(:)隔开。 -
PATH
是可以被修改的,可以直接通过衔接字符串的方法增加:1
PATH="${PATH}:/root"
- 但是为了安全起见,不建议将本目录(.)加入PATH的查找目录
6.2 文件 与目录管理
6.2.1 文件与目录的查看:ls
1 | ls [-aAdfFhilnrRSt] 文件名或目录名称 |
- 只执行
ls
默认是显示着色的非隐藏文件的文件名、以文件名进行排序。 - 很多Linux发行版在默认情况下,已经将
ll
通过alias
设置成ls -l
的意思。
6.2.2 复制、删除和移动:cp、rm、mv
cp(复制文件或目录)
1 | cp [-adfilprsu] source destination |
- 默认情况下,cp的源文件和目标文件的权限是不同的,目标文件的拥有者会变成命令操作者本身。文件建立的时间也会发生变化。
- 由于普通用户并不能随意修改文件的拥有者和用户组,即使加上
-a
属性,也无法完成目标文件拥有者和用户组的复制
- 由于普通用户并不能随意修改文件的拥有者和用户组,即使加上
- 没有加上任何选项时,cp一个链接文件复制的是原始文件,而不是链接文件的属性。如果要复制链接文件的属性,就要加上
-d
了。
rm(删除文件或目录)
1 | rm [-fir] 文件或目录 |
- 如果身份是root,默认把
rm -r
通过alias
替换成了rm -ri
,作为对系统的保护。可以通过在命令前加反斜杠\rm -r
来忽略掉alias
的指定选项。
mv(移动文件或目录,或重命名)
1 | mv [-fiu] source destination |
mv
还可用于修改文件名,不过Linux还有rename
命令专门用来更改大量文件的文件名
6.2.3 获取路径的文件名与目录名称
1 | basename /etc/sysconfig/network # 取得最后的文件名 |
6.3 文件内容查看
cat
由第一行开始显示文件内容,tac
从最后一行开始显示nl
显示的时候同时输出行数more
一页一页显示文件内容。less
和more
类似但是可以往前翻页。head
只看前几行,tail
只看后几行od
以二进制的方式读取文件内容
6.3.1 直接查看文件内容
cat(Concatenate)
1 | cat [-AbEnTv] 文件名 |
tac(反向列示)
- 由最后一行到第一行反向在屏幕上显示出来
1 | tac 文件名 |
nl(添加行号打印)
1 | nl [-bnw] 文件 |
6.3.2 可翻页查看
more(一页一页翻动)
有几个按键可以按的:
- 空格键(space):代表下翻一页
- Enter:下翻一行
- /字符串:代表在这个显示的内容中,向下查找字符串这个关键词
- 按n查找下一个匹配的字符串
:f
:立刻显示出文件名以及目前显示的行数- q:代表立刻离开more ,不再显示该文件内容
- b或[ctrl]-b:代表往回翻页,不过这动作只对文件有用,对管线无用
less(一页一页翻动,增加往上翻动)
相较于more,less可以向上向下翻动和查找,方便了很多。可以使用的指令有:
- 空格键:向下翻动一页
- [pagedown]:向下翻动一页
- [pageup]:向上翻动一页
- /字符串:向下查找字符串
- ?字符串:向上查找字符串
- n:重复前一个查找(与/或?有关)
- N:反向重复前一个查找
- g:前进到这个数据的第一行
- G:前进到这个数据的最后一行
- q:离开less这个程序
这些按键实际上在介绍man
时介绍过了,因为man
就是调用less
来显示文件内容的。
6.3.3 数据截取
head(取出前几行)
1 | head [-n number] 文件 |
- 缺省情况下显示前10行。
- number可以是个负数,代表打印倒数第number行前的所有行
tail(取出后几行)
1 | tail [-n number] 文件 |
- 缺省情况下显示后10行。
- number前可以加上+,表示打印正数number行后的所有内容
6.3.4 非纯文本文件:od
1 | od [-t TYPE] 文件 |
6.3.5 修改文件时间或创建新文件:touch
Linux下文件有三个主要的变动时间,这三个时间的意义是:
- 修改时间(modification time,mtime):文件内容数据变动的时间
- 状态时间(status time,ctime):文件的状态,如权限或属性,变动的时间
- 读取时间(access time,atime):文件内容被读取的时间
在默认情况下,ls
显示出来的是该文件的mtime。想让文件的时间变成【现在】的时间,就需要借助touch
命令
1 | touch [-acdmt] 文件 |
- 本质上,
touch
改变的只有mtime和atime,ctime是系统自动管理的。 - 默认情况下,
touch
一个文件会让这个文件的三个时间都变成现在。若这个文件不存在会被新建成一个空文件,因此touch
也被用于新建空文件。
6.4 文件与目录的默认权限与隐藏权限
6.4.1 文件默认权限:umask
在默认情况下,若用户建立为文件则默认没有可执行(x)权限,即只有rw这两个项目,最大为666:-rw-rw-rw-。若用户建立为目录,则由于x与是否可以进入这个目录有关,因此默认所有权限都是开放的,即777:drwxrwxrwx。
而umask
就用于查看或修改用户建立文件或目录的默认权限。查看有两种方法
1 | umask # 打印数字类型的权限值 |
umask
返回的数字指的是上面默认值需要减掉的权限。比如022的umask
指的就是新建的文件或目录的权限里,相较于默认权限,需要在group和others两个维度去掉w这个权限。
设置umask
直接通过umask 数字
即可,如umask 002
。
在默认情况下,root的umask会因为安全原因拿掉比较多的属性,默认是022。而一般身份的用户的umask是002,保留了同组用户的写入能力。
6.4.2 文件隐藏属性
除了rwx属性,文件还有一些隐藏属性。这些隐藏属性对于系统有很大的帮助,尤其是在系统安全上面。不过要先强调的是,下面的chattr
指令只能在Ext2/Ext3/Ext4的Linux传统文件系统上面完整生效, 其他的文件系统如xfs可能就无法完整的支持这个指令了。
chattr(配置文件隐藏属性)
1 | chattr [+-=][ASacdistu] 文件或目录名称 |
- 由于这些属性是隐藏的性质,所以需要以
lsattr
才能看到这些属性。 - 对于logfile这样的日志文件,就更需要+a这个可以增加但是不能修改旧数据与删除的参数了。
lsattr(显示文件隐藏属性)
1 | lsattr [-adR] 文件或目录 |
6.4.3 文件特殊权限:SUID、SGID、SBIT
除了rwx权限,一些文件或目录(如/tmp)还有像s和t的特殊权限。它们与系统账号和进程管理有关。
Set UID (SUID)
当s出现在文件拥有者的x权限上时,就被称为Set UID,简称为SUID的特殊权限。它有这样的功能和限制:
- SUID权限仅对二进制程序有效(不能用在shell脚本上)
- 执行者对于该程序需要具有x的可执行权限
- 仅在执行该程序的过程中,执行者将具有该程序拥有者(owner)的权限。
比如passwd
这个命令就是典型的SUID,普通用户不拥有/etc/shadow的修改权限,但是在执行passwd
时获得了root权限,因此能成功修改/etc/shadow上自己的密码。
Set GID (SGID)
当s出现在用户组的x权限上时,就被称为Set GID,简称为SGID的特殊权限。
当一个文件被设置SGID后,SGID有这样的功能和限制:
- SGID权限仅对二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 仅在执行该程序的过程中,执行者将具有该程序用户组的权限。
当一个目录被设置SGID后,SGID有这样的功能和限制:
- 用户若对于此目录具有r与x的权限时,该用户能够进入此目录;
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;
- 若用户在此目录下具有w的权限,则用户所建立的新文件的用户组和此目录的用户组相同。
Sticky Bit (SBIT)
当t出现在其他人的x权限上时,就被称为Sticky Bit,简称为SBIT的特殊权限。
SBIT只对目录有效,对与目录的作用是:
- 当用户对一个目录具有写入权限时,仅有自己与root才有权力删除、改名、移动他自己建立的文件或目录。
SUID/SGID/SBIT权限设置
在chmod
设置数字权限的时候,在三位数字之前再加一位就是SUID/SGID/SBIT权限。
- 4为SUID
- 2为SGID
- 1为SBIT
注意,SUID不作用于目录,SBIT不作用于文件。
有一个特别要注意的例子
1 | chmod 7666 test |
注意,这里大写的S和T代表的就是无效的SUID/SGID/SBIT权限。因为user,group以及others都没有x权限,而SUID/SGID/SBIT权限实际上是借用这三者的权限,这三者因为是666都没有x权限,SUID/SGID/SBIT权限就变成无效的了。
另外也可以通过符号法设置SUID/SGID/SBIT权限,其中SUID是u+s,SGID是g+s,SBIT是o+t。
6.4.4 观察文件类型:file
如果你想要知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share library),压缩文件是使用哪一种压缩方式等信息,就可以利用 file 这个命令来查看。举例来说:
1 | file 文件 |
6.5 命令和文件的查找
6.5.1 脚本文件的查找
which(查找【执行文件】)
这个命令是根据【PATH】这个环境变量规范的路径去查找执行文件的文件名。
1 | which [-a] command |
6.5.2 文件的查找
通常我们都是先使用whereis
或者是locate
来检查,如果真的找不到了才以find
来查找。因为whereis
只找系统中某些特定目录下面的文件,locate
则是利用数据库来查找文件名,当然两者就相当的快速。而find
实际查找硬盘内的文件系统状态,比较费时间也影响硬盘性能。
whereis
whereis
只查找几个特定目录,并没有全系统查询,所以比find
要快得多。
1 | whereis [-bmsu] 文件或目录名 |
locate / updatedb
locate
的使用更简单了,在包含路径的完整文件名中,只要有kayword在其中就会被显示出来。
1 | locate [-ir] keyword |
使用locate
来寻找数据的时候特别的快, 这是因为locate
是依据/var/lib/mlocate内的数据库记载,找出使用者输入的关键字文件名。
但是数据库的建立默认是每天执行一次,所以当你在数据库更新之前查找新建立起来的文件时,locate
会返回【找不到】。这种情况下就需要使用updatedb
来手动更新数据库。updatedb
会根据/etc/updatedb.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件;因为updatedb
会去查找硬盘,所以更新需要等待几分钟的时间。
find
1 | find [PATH] [option] [action] |
二、习题解答(非官方,仅为个人练习记录)
-
早期的UNIX系统文件最多允许14个字符,而新的UNIX与Linux系统中,文件名最多可以使用几个字符?
若使用ext2、ext3、ext4或xfs,255个英文字符或128个中文字符。
-
当一个一般文件权限为-rwxrwxrwx则表示这个文件的意义是什么?
所有人都可以读、写和执行。
-
我需要将一个文件的权限改为-rwxr-xr–,请问该如何执行命令?
1
2chmod 754 filename
chmod u=rwx,g=rx,o=r filename -
若我需要更改一个文件的拥有者和用户组,该用什么命令?
chown
和chgrp
-
请问下面的目录主要放置什么数据:/etc, /boot, /usr/bin, /bin, /usr/sbin, /sbin, /dev, /var, /log, /run
- /etc:系统主要的配置文件。
- /boot:开机会使用到的文件,包括Linux内核文件以及启动选项与启动所需配置文件等等。
- /usr/bin, /bin:在单人维护模式下还能够被操作的命令。
- /usr/sbin, /sbin:开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令。
- /dev:设备与接口设备
- /var:经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件
- /log:日志文件
- /run:系统开机后所产生的各项信息。
-
若一个文件的文件名开头为“ . ”,例如.bashrc这个文件,代表什么?另外,如何显示出这个文件名与他的相关属性?
代表它是一个隐藏文件。使用
ls -al
命令。