文件和目录管理
FHS
FHS,文件系统层次标准。多数Linux版本采用这种文件组织形式,类似于 Windows 操作系统中C盘的文件目录,采用树形结构组织文件。
FHS,定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理和矛盾处理。
根目录
在 Linux 中,根目录使用“ROOT”或者“/”表示。
ls /
FHS 定义的目录结构
目录 | 目录的用途 |
---|---|
/bin | 常见的用户指令 |
/boot | 内核和启动文件 |
/dev | 设备文件 |
/etc | 系统和服务的配置文件 |
/home | 系统默认的普通用户的家目录 |
/lib | 系统函数库目录 |
/lost+found | ext3 文件系统需要的目录,用于磁盘检查 |
/mnt | 系统加载文件系统时常用的挂载点 |
/opt | 第三方软件安装目录 |
/proc | 虚拟文件系统 |
/root | root 用户的家目录 |
/sbin | 存放系统管理指令 |
/tmp | 临时文件的存放目录 |
/usr | 存放与用户直接相关的文件和目录 |
/media | 系统用来挂载光驱等临时文件系统的挂载点 |
绝对路径和相对路径
绝对路径
绝对路径一定是以“/”开头的
pwd // 查看当前路径
特殊目录
在每个目录下,都会固定存在两个特殊目录,分别是一个点(.)和两个点(..)的目录。前者表示的是当前目录,后者表示的是上层目录。
在Linux下,所有以点开头的文件都是"隐藏文件",对于这类文件,只是用命令ls-l是看不到的,必须要使用ls-la才可以看到。
相对路径
顾名思义,“相对路径”的关键在于当前在什么路径下。假设当前目录在/usr/local下,那么它的上层目录(/usr目录)可以用../表示,而/usr/local的下层目录(src)则可以用./src表示。
cd ..
文件的相关操作
Linux 遵循一切皆文件的规则。
创建文件
touch
如果文件存在,则更改文件的修改时间属性。
删除文件
rm FileName
移动或重命名文件
移动文件
mv FileName
重命名文件
mv OldFileName NewFileName
Linux 下的目录也是一种“文件”,所以这里将的 mv 命令也用样适用于对目录的操作。
查看文件
cat FileName
查看文件头
有时候文件非常大,使用 cat 命令显示出来的内容太多,而我们可能并不像查看全部内容,只是想看看文件开始部分的内容,这时候可以使用 head 命令了,后面跟上需要查看的文件名就可以了。默认显示10行。
head FileName
也可以使用 -n 参数指定显示的行数
查看文件尾
tail FileName
和 head 命令正好相反,默认同样是10行。
但是 tail 还有个更实用的功能,就是可以动态地查看文件尾。这对查看一些不断改变的文件来说是非常有用的。比如系统中会有很多日志文件,这些文件是会随时变化的。
要查看这些动态地文件可以使用 -f 参数。
目录的相关炒作
与其他操作系统一样,Linux 也有目录的概念,目录的作用在于存放其他的目录和文件。
进入目录
cd DirName
创建目录
mkdir DirName
使用 -p 参数可以一次性创建所有目录
删除目录
rm
删除非空目录,加上参数 -f
递归删除目录,加上参数 -r
通常使用 rm -rf 来删除目录,但是有安全风险。
文件和目录的复制
cp FileName|DirName
第三个参数为重命名
cp FileName|DirName [newName]
文件和目录的权限
查看文件或目录的权限
ls -al
这条命令中 -l 表示列出每个文件的详细信息,-a 表示同时列出隐藏文件!
第一列便是文件的类别和权限。
其中第一个字符的取值范围如下:
第一个字符 | 含义 |
---|---|
d | 目录 |
- | 普通文件 |
l | 链接文件 |
b | 块文件 |
c | 字符文件 |
s | socket 文件 |
p | 管道文件 |
第二列代表连接数,除了目录文件之外,其他所有文件的连接数都是1,目录文件的连接数是该目录中包含其他目录的总个数+2,也就是说,如果目录A中的包含目录B和C,则目录A的连接数为4。
第三列代表该文件的所有人。
第四列代表该文件的所有组。
第五列代表文件的大小。
第六列代该文件的创建时间或最近的修改时间。
第七列是文件名。
文件的隐藏属性
Linux 下的文件还有一些隐藏属性,必须使用如下命令查看:
lsattr
结果中第一列是13个小短横,其中每一个下横线都是一个属性,如果当前位置上设置了该属性就会显示相对应的字符。
如果要设置文件的隐藏属性,需要使用如下命令:
chattr
常用属性 | 含义 |
---|---|
a | 文件只能在尾部增加数据而不能被删除 |
i | 文件将无法写入、改名、删除,即便是root用户也不行 |
改变文件权限
Linux下每个文件都定义了文件拥有者(user)、拥有组(group)、其他人(others)的权限,使用 u、g、o 来分别表示拥有者、拥有组、其他人,而对应的具体权限则使用 rwx 的组合来定义,增加权限使用 + 号,删除权限使用 - 号,详细权限使用 = 号。
作用 | 命令 |
---|---|
某文件添加用户读权限 | chmod u+r FileName |
给某文件删除用户读权限 | chmod u-r FileName |
给某文件添加用户写权限 | chmod u+w FileName |
给某文件删除用户写权限 | chmod u-w FileName |
给某文件添加用户执行权限 | chmod u+x FileName |
给某文件删除用户执行权限 | chmod u-x FileName |
给某文件设定用户拥有读写执行权限 | chmod u=rwx FileName |
如果要给用户组或其他人添加或删除相关权限,只需要将上面的u相应地更换成 g 或 o 即可。
但是这一方式只能给文件拥有者、文件拥有组或者其他所有人设置权限,如果想同时设置所有人的权限就需要使用数字表示法了。
定义 r=4,w=2,x=1,如果权限是 rwx,则数字表示7,如果权限是 r-x,则数字表示为5.
如果是修改一个目录,且该目录下所有的目录文件都递归修改权限,则加上参数 -R 。
更改文件的拥有者
chown UserName FileName
如果需要修改的不是一个文件而是一个目录,以及该目录下所有的文件、子目录、子目录下的所有文件和目录,则需要使用 -R 参数,递归设置。
更改文件的拥有组
chgrp Group FileName
同样,使用 -R 参数递归设置
文件的特殊属性
如截图所示,权限中多了一个特殊的 “s”。这表示为 SUID 权限,这个权限只能用于二进制文件。
给一个二进制文件添加 SUID 权限的命令:
chmod u+s FileName
如果某个二进制文件的用户组被设置了 s 权限,则该文件的用户组中所有的用户都能以该文件的用户身份去运行这个命令,一般来说SGID 命令在系统中用的很少,给一个二进制文件添加 SGID 权限的命令:
chmod g+s FileName
Sticky 权限只能用于设置在目录上,设置了这种权限的目录,任何用户都可以在该目录中创建或修改文件,但是只有该文件的创建者和 root 可以删除自己的文件。
chmod o+t DirName
默认权限和umask
对于 root 用户,文件的默认权限是 644 ,目录的默认权限是 755 ;对于普通用户,文件的默认权限是 664,目录的默认权限是775.
那么这个值是如何计算出来的呢?
是通过遮罩(umask)来实现的。首先看一下 /etc/profile 文件中,通过第51行道55行的一段代码设置了不同用户的遮罩值。
从上面的代码中可以看出,UID大于99的用户设置了umask为002,否则为022。所以umask值对于root用户是022,对于普通用户是002,这就造成了上面我们看到的root用户和普通用户创建出来的文件和目录默认权限是不一样的。
如何使用遮罩计算权限?
777 用字符串表示为:rwxrwxrwx,如果遮罩值为022,用字符串表示为 ----w--w-,那么前者第五位和第八位的w被遮罩掉,权限变作rwxr-xr-x,用数字表示就是755。
不能通过同位相减的方法计算遮罩后的值,比如说777-022同位相减得到755,666-022同位相减得到644,这种看似正确的结果其实只是一种巧合,并不是了解遮罩的正确方式。假设有个文件的权限为666,在遮罩值为011的情况下,采用该方法计算得到的权限值为655,但实际上正确的权限值为666。
查看文件类型
file PATH -name FileName
数据库查找
与 find 不同,locate 命令依赖于一个数据库文件,Linux系统默认每天会检索一下系统中的所有文件,然后将检索到的文件记录到数据库中。在运行 lcoate 命令的时候可直接到数据库中查找记录并打印到屏幕上,所以使用 locate 命令要比 find 命令反馈更为迅速。
在执行这个命令之前一般需要执行 updatedb 命令(这不是必须的,因为系统每天会自动检索并更新数据库信息,但有时候会因为文件发了变化而系统还没有再次更新而无法找到实际上存在的文件。所以需要主动运行该命令,以创建新的文件列表数据库),以及时更新数据库记录。
查找执行文件
which 用于从系统的PATH变量所定义的目录中查找可执行的绝对路径。
使用 whereis 也能查到其路径,但是和 which 不同的是,它不但能找出其二进制文件,还能找出相关的 man 文件。
文件压缩和打包
gizp/gunzip
gzip/gunzip 是用来压缩和解压缩单个文件的工具,使用方法比较简单。
gzip FileName
gunzip FileName
tar
tar 不但可以打包文件,还可以将整个目录中的全部文件整合成一个包,整合包的同时还能使用 gzip 的功能进行压缩,比如说把整个 /boot 目录整合并压缩成一个文件。
一般来说,整合后的包习惯使用 .tar 作为其后缀名,使用 gzip 压缩后的文件则使用 .gz 作为其后缀名。因为 tar 有同时整合和压缩的功能,所以可使用 .tar.gz 作为后缀名,或者简写为 .tgz。
tar -zcvf boot.tgz /boot
这里 -z 的含义是使用 gzip 压缩,-c 是创建压缩文件,-v 是显示当前被压缩的文件,-f 是指使用文件名
解压命令如下:
tar -zxvf boot.tgz -C DirName
后面可以使用 -C 来指定压缩后文件的存放目录
bzip2
使用 bzip2 压缩文件时,默认会产生以 .bz2 扩展名结尾的文件,这里使用 -z 参数进行压缩,使用 -d 参数进行解压缩。
cpio
该命令一般是不单独使用的,需要和find命令一同使用。当由find按照条件找出需要备份的文件列表后,可通过管道的方式传递给 cpio 进行备份,生成 /tmp/conf.cpio 文件,然后再将生成的 /tmp/conf.cpio 文件中包含的文件列表完全还原回去。