3.4 文件与目录管理
3.4.1 链接文件的介绍和使用
在了解链接文件之前,应该首先学习inode。
1.inode
inode译成中文就是索引结点。每个存储设备或存储设备的分区(存储设备是硬盘、U盘等)被格式化为文件系统后,应该有两部分:一部分是inode;另一部分是Block。Block是用来存储数据的,而inode就是用来存储关于这些数据的信息的,这些信息包括文件大小、属主、属组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统能根据指令通过inode值很快找到相对应的文件。
使用ls查看某个目录或文件时,如果加上“-i ”参数,就可以看到inode结点了;比如前面的例子:
结果如图3-14所示。
图3-14 abc.txt的inode值
abc.txt的inode值是395021。
2.链接文件
当需要在不同的目录中用到相同的某个文件时,不需要在每一个目录下都放一个该文件,这样会重复占用磁盘空间,也不便于同步管理。为此,可在某个固定的目录中放置该文件,然后在其他需要用该文件的目录中,利用ln命令创建一个指向该文件的链接即可,所生成的文件即为链接文件或称符号链接文件。在Linux系统中,链接的方式有硬链接和软链接两种。
ln命令介绍如下。
格式:ln[选项]目标文件 链接文件
功能:创建链接文件,默认创建硬链接文件。
主要选项说明如下。
● -b(backup):若存在同名文件,则覆盖前备份原来的文件。
● -s(symbolic):创建符号链接文件。
3.硬链接文件
在Linux文件系统中,inode值相同的文件是硬链接文件,也就是说,不同的文件名,inode可能是相同的,一个inode值可以对应多个文件。理解链接文件并不难。在Linux系统中,链接文件是通过ln命令来创建的。
用ln命令创建硬链接的语法格式:
硬链接无法跨越不同的文件系统、分区和挂载的设备,只能在原文件所在的同一磁盘的同一分区上创建硬链接,而且硬链接只能针对文件,不能用于目录。
【例3-10】 为abc.txt文件创建其硬链接abc02.txt,然后查看abc.txt和abc02.txt的属性变化。
过程及结果如图3-15所示。
图3-15 创建abc.txt的硬链接
可以看到abc.txt在没有创建硬链接文件abc02.txt时,其链接个数是1(也就是-rwxr-xr-x后的那个数值),创建了硬链接abc02.txt创建后,这个值变成了2。也就是说,每次为abc.txt创建一个新的硬链接文件后,其硬链接个数都会增加1。
inode值相同的文件,它们的关系是互为硬链接的关系。当修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果删除互为硬链接关系的某个文件时,其他的文件并不受影响。比如把abc.txt删除后,还是能看到abc02.txt的内容,并且abc02.txt仍是存在的。
【例3-11】 删除abc.txt文件,并查看abc02.txt的内容。
过程及结果如图3-16所示。
图3-16 删除硬链接文件
4.软链接文件
软链接将会生成一个很小的链接文件,该文件的内容是要链接到的文件的路径。删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,却不能查看软链接文件的内容。
软链接可以跨越各种文件系统和挂载设备。
创建软链接(也被称为符号链接)的语法格式:
【例3-12】 为bnm.txt文件创建其硬链接bnm002.txt,然后查看bnm.txt和bnm002.txt的属性的变化。
过程及结果如图3-17所示。
图3-17 创建bnm.txt文件的软链接
从图3-17可以看出,bnm.txt和bnmoo2.txt两个文件的区别及相同点如下。
1)两个文件的结点不同。
2)两个文件的文件类型不同。bnm.txt是“- ”,也就是普通文件,而bnm002.txt是“l”,它是一个链接文件。
3)两个文件的读写权限不同,bnm.txt是rwxr-xr-x,而bnm002.txt的读写权限是rwxr-wxrwx。
4)两者的硬链接个数相同,都是1。
5)两文件的属主和所归属的用户组相同。
6)修改(或访问、创建)时间不同。
而且,bnm002.txt后面有一个标记“->bnm.txt”,这表示bnm002.txt是bnm.txt的软链接文件。
值得注意的是,修改链接文件的内容就意味着在修改源文件的内容。当然,源文件的属性也会发生改变,链接文件的属性并不会发生变化。当把源文件删除后,链接文件只存在一个文件名,因为失去了源文件,所以软链接文件也就不存在了。这一点和硬链接是不同的。
【例3-13】 删除bnm.txt文件,查看bnm002.txt的属性和内容。
过程及结果如图3-18所示。
图3-18 删除软链接文件
从例3-13可以看出,如果一个链接文件失去了源文件,就意味着它已经不存在了。软链接文件其实只是源文件的一个标记,当失去源文件时,软链接文件也就不存在了。软链接文件的只是占用了inode来存储软链接文件的属性等信息,但文件存储是指向源文件的。
软链接对文件或目录都适用。无论是软链接还是硬链接,都可以用rm命令来删除链接文件。
3.4.2 查找文件
1.使用find命令查找文件
格式:find[路径][表达式]
功能:将文件系统指定[路径]内符合[表达式]条件的文件列出来。可以指定文件的名称、类别、时间、大小、权限等不同条件的组合,列出完全符合条件的文件。
主要表达式如下。
● -name文件:按文件名查找,可使用通配符。
● -g组群号:查找文件的所属组为指定组群的文件。
● -user用户名:查找文件所有者为指定用户的文件。
● -type文件类型:按照文件类型查找,其中d为目录文件,l为符号文件。
● -size[+| -]:文件大小,查找指定大小的文件。
【例3-14】 将当前目录及其子目录下文件名以“k”打头的文件列出。
过程及结果如图3-19所示。
图3-19 当前目录及其子目录下文件名以“k”打头的文件
【例3-15】 将/sbin目录及其子目录下所有链接文件列出。
过程及结果如图3-20所示。
图3-20 将/sbin目录及其子目录下所有链接文件列出
【例3-16】 查找/sbin目录中所有大于1024 KB的文件。
过程及结果如图3-21所示。
图3-21 查找/sbin目录中所有大于1024 KB的文件
2.使用whereis命令查找文件
格式:whereis[选项]文件名
功能:可以迅速地找到文件,而且可以提供这个文件的二进制可执行文件、源代码文件和使用手册页存放的位置。
主要选项说明如下。
● b:只查找二进制文件。
● m:查找主要文件。
● s:查找来源。
● u:查找不常用的记录文件。
【例3-17】 查找find文件。
过程及结果如图3-22所示。
图3-22 使用whereis命令查找find文件
3.文件中字符串的查找
格式:grep[选项]字符串 文件列表
功能:从指定文本文件或标准输出中查找符合条件的字符串,默认显示其所在行的内容。
主要选项说明如下。
● -c:只输出匹配的行的总数。
● -i:不区分大小写(只用于单字符)。
● -n:显示行号。
● -l:显示匹配的行及行号。
● -s:不显示不存在或无匹配文件等错误信息。
【例3-18】 在/etc/passwd文件中查找包含“aaa”的行,并显示其行号。
过程及结果如图3-23所示。
图3-23 /etc/passwd文件中查找包含“aaa”的行并显示其行号
3.4.3 文件的归档与压缩
1.使用tar命令进行归档
对于Linux系统中需要进行备份的文件和目录,tar命令可以将其打包到一个文件中进行备份,这个功能叫作对文件或目录进行归档。
格式:tar选项 文件目录列表
功能:对文件目录进行打包备份。
主要选项说明如下。
● -c:建立新的归档文件。
● -r:向归档文件末尾追加文件。
● -x:从归档文件中释放文件。
● -O:将文件解开到标准输出。
● -v:处理过程中输出相关信息。
● -f:对普通文件操作。
● -z:调用gzip来压缩归档文件,与-x联用时调用gzip完成解压缩。
● -Z:调用compress来压缩归档文件,与-x联用时调用compress完成解压缩。
● -j:调用bzip2程序对文件进行压缩,压缩后文件扩展名为.bz或.bz2。
(1)创建.tar包文件
选项“-c”用于创建一个.tar包文件。
【例3-19】 将/etc/vsftpd目录下的文件打包备份到/tmp/ftp.tar。
过程及结果如图3-24所示。
图3-24 将/etc/vsftpd目录下的文件打包备份到/tmp/ftp.tar
其中,
● -c:用于创建.tar包。
● -v:在执行时给出详细信息。
● -f:用于指定.tar包的文件名。
命令执行后会在/tmp下生成一个名为ftp.tar的文件,这个过程仅对目录/etc/vsftpd下的文件进行打包,并不进行压缩。
(2)创建压缩的.tar包
没有经过压缩而生成的.tar包一般比较大,为了节省磁盘空间,通常需要对.tar包进行压缩。tar命令本身只进行打包不压缩。通常使用tar命令配合其他的压缩命令对.tar包进行压缩或解压缩,tar命令也提供了相应的选项直接调用其他命令的压缩解压缩功能。例如,在tar命令中增加使用“-z”或“-j”等参数,就可以调用gzip或bzip2对其进行压缩。
【例3-20】 将/etc/vsftpd目录下的文件打包备份到/tmp/ftp.tar.gz。
过程及结果如图3-25所示。
图3-25 用gzip压缩文件
其中,
● -z:是指用gzip程序进行压缩。
● -c:用于创建.tar包。
● -v:在执行时给出详细信息。
● -f:用于指定.tar包的文件名。
【例3-21】 将/etc/vsftpd目录下的文件打包备份到/tmp/ftp.tar.bz2。
过程及结果如图3-26所示。
图3-26 用bzip2压缩文件
其中,
● -j:是指调用bzip2程序进行压缩.tar包。
● -c:用于创建.tar包。
● -v:在执行时给出详细信息。
● -f:用于指定.tar包的文件名。
进入/tmp目录,对比刚才已经建立的ftp.tar文件、ftp.tar.bz2文件和ftp.tar.gz文件的大小,如图3-27所示。
图3-27 显示文件属性
(3)释放.tar包
选项“-x”用于释放.tar包。在释放.tar包时,将按照原备份路径释放和恢复,若要将软件包释放到指定的位置,可使用“-C路径名”参数来指定要释放到的位置。
【例3-22】 释放/tmp/ftp.tar包。
[root@dns~] # tar -xvf /tmp/ftp.tar
对于.gz格式的压缩包,增加“-z”参数,参见例3-23。
【例3-23】 释放/tmp/ftp.tar.gz包。
对于.bz或.bz2格式的压缩包,增加“-j”参数,参见例3-24。
【例3-24】 释放/tmp/ftp.tar.bz2包。
(4)查询tar包中的文件列表
使用带“-t”参数的tar命令来实现查询.tar包中的文件列表。
【例3-25】 查询/tmp/ftp.tar包中的文件列表。
过程及结果如图3-28所示。
图3-28 查询文件列表
若要显示文件列表中每个文件的详细信息,可以增加参数“-v”。若要查看.gz压缩包中的文件列表,则还应该使用“-z”参数,参见例3-26。
【例3-26】 查询/tmp/ftp.tar.gz包中的文件列表。
过程及结果如图3-29所示。
图3-29 查询.gz压缩包中的文件列表
若要查看.bz或.bz2格式的压缩包的文件列表,则应该增加“-j”参数,参见例3-27。
【例3-27】 查询/tmp/ftp.tar.bz2包中的文件列表。
过程及结果如图3-30所示。
图3-30 查询.bz2压缩包的文件列表
2.文件的压缩与解压缩
除了使用tar命令提供的相应选项直接调用其他命令的压缩解压缩功能来对文件压缩解压缩以外,Linux还有两对命令来完成文件的压缩和解压缩,即zip和unzip、gzip和gunzip。
(1)zip和unzip
1)zip命令。
格式:zip[选项]文件
功能:压缩文件。
主要选项说明如下。
● -d:删除。
● -g:增加而不重新产生。
● -u:更新。
● -r:压缩子目录。
zip所使用的格式其实与DOS和Windows的.zip格式是完全一样的。也就是说,它无需经过打包和压缩两道工序,就可以产生兼有两种效用的“压缩文件包”。而且,如果使用这种格式,就可以和.bmp、.jpg、.gif等格式文件一样,自由地通行于Windows和Linux之间。例如,可以在Windows中用WinZip程序解压缩,或者用WinZip压缩成.zip格式文件直接送给Linux系统使用。
【例3-28】 将/var/spool/下的所有文件打包成一个mail.zip文件。
过程及结果如图3-31所示。
图3-31 将/var/spool/下所有文件打包成一个mail.zip文件
Linux自带的unzip命令可以解压缩Linux或Windows下的.zip格式的压缩文件。
2)unzip命令。
格式:unzip[选项]压缩文件名.zip
主要选项说明如下。
● -x:文件列表解压缩文件,但不包括指定的文件。
● -v:查看压缩文件目录,但不解压缩。
● -t:测试文件有无损坏,但不解压缩。
● -d:把压缩文件解压缩到指定目录下。
● -z:只显示压缩文件的注解。
● -n:不覆盖已经存在的文件。
● -o:覆盖已存在的文件且不要求用户确认。
● -j:不重建文档的目录结构,把所有文件解压缩到同一目录下。
【例3-29】 将mail.zip文件解压缩到目录/tmp下,如果已有相同的文件存在,要求unzip命令不覆盖原来的文件。
过程及结果如图3-32所示。
图3-32 用unzip命令解压缩文件
(2)gzip和gunzip
1)gzip命令。
格式:gzip[选项]文件|目录列表
功能:压缩/解压缩文件。无选项参数时执行压缩操作,压缩后产生扩展名为.gz的压缩文件,并删除源文件。
主要选项说明如下。
● -v:输出处理信息。
● -d:解压缩指定文件,相当于使用gunzip命令。
● -r:参数为目录时,按目录结构递归压缩目录中的所有文件。
【例3-30】 进入/test目录,采用gzip命令压缩/test目录下所有文件。
过程及结果如图3-33所示。
图3-33 用gzip命令压缩文件
从图3-33可以看到,gzip命令和刚才使用的zip命令不一样,它没有归档功能。当压缩多个文件时将分别压缩每个文件,使之成为.gz压缩文件。
2)gunzip命令用来解压缩文件,可以解压扩展名为.gz、.z、.Z和.tgz等类型的压缩文件,功能和“gzip -d”命令是一样的。
【例3-31】 进入/test目录,采用gunzip解压缩/test目录下所有文件。
过程及结果如图3-34所示。
图3-34 用gunzip命令解压缩文件