1.5 文件管理
1.5.1 文件和目录简介
Linux使用树状的目录结构组织文件,简单来说就是在一个目录中放置子目录和文件,子目录中可以继续放置子目录和文件,以此类推,形似一棵树的分支(如图1-53所示)。Linux的这种文件结构的起始点为“根目录”,就是“/”,是一切文件的起点。FHS(文件系统层次标准)定义了在根目录下的主要目录和每个目录内应该放置的文件。
图1-53 查看根目录中的文件
请注意在Linux中,“文件”是一种很宽泛的概念,一切皆文件。所以不管是目录还是设备,都是一种文件,或者说,只要是在系统中可以看到的都是文件。
对于系统中任何具体的文件来说,都一定可以通过绝对路径找到。比如系统引导文件grub.conf。
[root@localhost ~]# ls /boot/grub/grub.conf /boot/grub/grub.conf
但是假设现在所在的目录是/boot,那么该文件就可以使用相对路径找到。
[root@localhost ~]# cd /boot [root@localhost boot]# ls ./grub/grub.conf ./grub/grub.conf
这里的点(.)代表当前目录,很多时候可以省略。
[root@localhost boot]# ls grub/grub.conf grub/grub.conf
想要回到当前目录的上层目录,使用两个点(..),代表上层目录,也是一个相对路径的写法。
[root@localhost boot]# cd .. [root@localhost /]#
1.5.2 文件和目录权限
使用ls命令,结合“-l”参数查看文件的权限,结合“-ld”参数查看目录的权限,查看/root目录以及查看/root目录下文件的权限如下:
[root@localhost ~]# ls -l total 20 -rw-------. 1 root root 1122 Jul 6 04:57 anaconda-ks.cfg -rw-r--r--. 1 root root 9562 Jul 6 04:57 install.log -rw-r--r--. 1 root root 3161 Jul 6 04:56 install.log.syslog [root@localhost ~]# ll -d /root dr-xr-x---. 2 root root 4096 Jul 6 05:00 /root
正如上述示例所示,ls -l格式化地输出了文件的详细信息,每个文件都有7列输出。第一列是文件类别和权限,这列由10个字符组成,第一个字符表明该文件的类型。表1-1列出了第一个字符可能的值和对应代表的含义。接下来的属性中,每3个字符为一组,第2~4个字符代表该文件所有者(user)的权限,第5~7个字符代表给文件所有组(group)的权限,第8~10个字符代表其他用户(others)拥有的权限。每组都是“rwx”的组合,如果拥有读权限,则该组的第一个字符显示r,否则显示一个小横线;如果拥有写权限,则该组的第二个字符显示w,否则显示一个小横线;如果拥有执行权限,则第三个字符显示x,否则显示一个小横线。
表1-1 文件权限首字符含义
1.5.3 文件查找
操作系统中有成千上万的文件散落在文件系统的各个角落中,还有不同用户创建的各种文件,随着系统的运行,文件数会越来越多,要想记住所有文件的位置是不可能的,但我们可以通过一些查找命令来进行。最常用的命令有find和locate。
其中find命令的使用格式为:
find PATH -name FILENAME
假设需要在系统中找到一个名为httpd.conf的文件,可以这么写:
[root@localhost ~]# find / -name httpd.conf
这条命令的意思是,从根目录开始寻找名字为httpd.conf的文件。由于是从根开始,find命令会遍历/下的所有文件,然后打印出找到的结果。如果读者有经验,大概知道这个文件可能存在于/etc下,因为看起来这是一个配置文件,这时便可以优化一下查找语句,这样耗时会更少,命令如下所示:
[root@localhost ~]# find /etc -name httpd.conf
可以使用星号通配符来模糊匹配要查找的文件名,比如想找出系统中所有以.conf结尾的文件,或是以httpd开头的文件:
[root@localhost ~]# find / -name *.conf [root@localhost ~]# find / -name httpd*
和find不同,locate命令依赖于一个数据库文件,Linux系统默认每天会检索一下系统中的所有文件,然后将检索到的文件记录到数据库中,在运行locate命令的时候可直接到数据库中查找记录并打印到屏幕,所以使用locate命令要比find命令的反馈更为迅速。在执行这个命令之前,一般需要执行updatedb命令(非必须,因为系统每天会自动检索并更新数据库信息,但是有时候因为文件发生了变化而系统还没有再更新,所以需要主动运行该命令,以创建最新的文件列表数据库),及时更新数据库记录,下面是使用locate命令查找httpd.conf文件的方法:
[root@localhost ~]# updatedb [root@localhost ~]# locate httpd.conf /etc/httpd/conf/httpd.conf
locate命令依赖于其用于记录文件的数据库,该数据库的更新需要使用updatedb。当然,系统每天也会自动运行一次,必要的时候可主动地手动更新。
对一些二进制的命令文件,可以通过which命令找到。which用于从系统的PATH变量所定义的目录中查找可执行文件的绝对路径。例如想查找passwd命令在系统中的绝对路径,可使用如下方法:
[root@localhost ~]# which passwd /usr/bin/passwd
1.5.4 文件压缩和打包
gzip/gunzip是用来压缩和解压单个文件的工具,使用方法比较简单,例如在/root目录下压缩install.log文件,压缩后产生的文件是install.log.gz文件,然后再使用gunzip文件将其解压缩:
[root@localhost ~]# gzip install.log [root@localhost ~]# ls install.log.gz install.log.gz [root@localhost ~]# gunzip install.log.gz
tar不但可以打包文件,还可以将整个目录中的全部文件整合成一个包,整合包的同时还能使用gzip的功能进行压缩,例如把整个/boot目录整合并压缩成一个文件。一般来说,对于整合后的包,业内习惯使用.tar作为其后缀名,使用gzip压缩后的文件则使用.gz作为其后缀名。因为tar有同时整合和压缩的功能,所以可使用.tar.gz作为后缀名,或者简写为.tgz,下面的命令将/boot目录整合压缩成了boot.tgz文件:
[root@localhost ~]# tar -zcvf boot.tgz /boot
这里-z的含义是使用gzip压缩,-c是创建压缩文件(create),-v是显示当前被压缩的文件,-f是指使用文件名,也就是这里的boot.tgz文件。解压命令如下:
tar -zxvf boot.tgz
上面的命令会直接将boot.tgz在当前目录中解压成boot目录,-z是解压的意思。如需指定压缩后目录存放的位置,需要再使用-C参数,比如说将boot目录解压到/tmp目录中:
tar -zxvf boot.tgz -C /tmp
使用bzip2压缩文件时,默认会产生以.bz2扩展名结尾的文件,这里使用-z参数进行压缩,使用-d参数进行解压缩:
[root@localhost ~]# bzip2 install.log [root@localhost ~]# ls -l install.log.bz2
-rw-r--r--1 root root 3588 Dec 10 03:08 install.log.bz2 [root@localhost ~]# bzip2-d install.log.bz2