文件是Linux中最重要的部分,Linux将所有对象都抽象成文件。Linux中一切皆文件,除普通文件外,目录也是文件,设备也是文件,网络通信接口也是文件等。本节先从宏观的角度介绍Linux的文件组织和基本概念,即Linux目录结构和路径;再对Linux下的文件分类进行说明;最后介绍文件权限的相关知识。
(1)目录结构
Linux目录结构是一个树状结构,总的起点是根(root)目录/。ls/可以列出/目录下的子目录,如bin、dev、home、etc等,这些子目录下又有子目录或文件。根目录下所有子目录和文件所构成的这种层次关系,就是Linux的目录结构。
路径 用来表示从Linux目录结构的某个位置(目录)开始到指定文件所遍历的目录和文件信息。路径分为 绝对路径 和 相对路径 两种。
(2)绝对路径
绝对路径是以/为起点进行遍历的路径。例如/var/log/messages就是一个绝对路径,起始位置是/,依次经过var和log两个子目录,最后到达messages文件本身,文件和目录之间用/进行分隔。绝对路径一定要注意的是以/作为开头。
(3)相对路径
相对路径有两种,一种是以当前目录为起点进行遍历的路径,另一种是以父目录(当前目录的上一级目录)为起点进行遍历的路径,具体示例如下。
1)切换当前目录到/var,命令如下所示。
2)Linux使用一个点(.)来表示当前目录,本例的当前目录对应的绝对路径是/var。因此,/var/log/messages的相对路径可以描述为./log/messages,如下所示。
3)Linux使用两个点(..)来表示当前目录的父目录,本例的当前目录是/var,父目录就是/,因此,相对路径可以描述为../var/log/messages,如下所示。
和绝对路径相比,相对路径更加灵活,因此不要为了访问文件A,将它的路径固定死,而是可以借用其他文件的位置,加上相对路径来描述A的位置。
初学者容易弄错相对路径,这里的关键是要先确定当前目录的位置,使用pwd可以打印当前目录的绝对路径;再用“.”或者“..”为起点来表示路径;此外,在描述相对路径时,使用〈Tab〉键进行补全和验证是确保描述正确的关键。
Linux中一切对象皆文件,总共分为七大类,分别是:普通文件、目录、链接文件、字符设备文件、块设备文件、套接字文件、管道文件,详细说明如下。
(1)普通文件
普通文件用来存储数据,像文本文件、可执行文件、压缩文件、C语言库文件等都是普通文件。从本质上讲,普通文件就是一段固定大小的连续字节流的集合,集合中字节的个数就是文件的大小。
普通文件又可以分为:文本文件和二进制文件两大类。文本文件是用户可以直接编辑的文件,它们采用特定的字符集编码,如UTF8/Unicode/ASCII码等,经过程序翻译后,可以转换成人能够读懂的文字,典型的文本文件如/etc/profile等;二进制文件是指除文本文件以外的普通文件,典型的二进制文件如可执行文件、C语言库文件和压缩文件等。
bash中不同的文件会有不同的颜色,例如文本文件是白色的、可执行文件是绿色的、压缩文件是红色的等。
使用ls -l可以查看文件的属性,其中文件类型位于属性信息的第一位,命令如下,普通文件使用一个横杠-来表示。
(2)目录
Linux中目录也是一种特殊的文件,典型的目录如根目录/下的boot、dev、etc、home等,目录在bash中是蓝色的。
目录类型使用d来表示,示例如下,boot是一个目录,其属性信息的第一位就是d,即directory的缩写。
(3)链接文件
链接文件是指 软链接 文件,它相当于Windows下的快捷方式。可以使用ln来创建软链接,如下所示,-s选项表示创建的是软链接,a是源文件路径,即本身存在的文件,b是软链接文件路径。
查看软链接文件b的信息,命令如下,软链接文件类型使用字母l来表示,在bash中软链接文件是蓝色的。还可以看到链接关系,是b指向a,b为链接文件,a是源文件。
通过软链接文件b,可以访问它所指向的源文件a的内容,示例如下,a和b内容完全相同。
初学者容易混淆软链接和硬链接的概念,它们的区别说明如下。
在创建软链接时,如果不加-s选项,创建的就是硬链接。硬链接相当于文件的文件名,文件可以分为两部分:文件名和文件内容。文件名可以有多个,文件内容只有一份,通过任何一个文件名,都可以读取/修改文件内容,删除任何一个文件名,只要还有其他的文件名,文件内容就不会删除,直到最后一个文件名被删除时,对应的文件内容也会被删除。因此,如果一个文件所有的硬链接都被删除,那么最后一个硬链接删除时,文件内容也将被删除。
软链接相当于快捷方式,即使所有的软链接都被删除,其源文件也不会被删除。
(4)字符设备文件
字符设备文件表示一个字符设备,例如/dev/tty、/dev/tty1、/dev/tty6就是典型的字符设备文件(有关tty的说明请参考1.2.4节内容)。
字符设备文件类型使用c表示,示例如下。字符设备文件在bash中是黄色的。
(5)块设备文件
块设备文件表示一个块设备,例如 /dev/sr0表示光驱设备,/dev/sda1表示硬盘上的一个分区,它们都是一个典型的块设备文件。块设备文件类型使用b表示,示例如下。块设备文件在bash中是黄色的。
将块设备文件同某个目录关联后,就可以访问该设备文件了,这个关联的过程称为mount(挂载),示例操作如下。
1)挂载之前,/media目录是空的,如下所示。
2)将光驱设备/dev/sr0挂载到/media目录,如下所示。
3)此时,/media目录下就不为空了,它的内容就是光驱设备中光盘的内容。
4)使用umount(卸载)可以取消/dev/sr0同/media目录之间的管理,如下所示。
(6)套接字文件
套接字文件用于进程间的网络通信,块设备文件类型使用s表示,在bash中是紫色的,如下所示。
(7)管道文件
管道文件用于进程间的通信,它就像一个先进先出的队列,一个进程向管道文件写入数据,另一个进程可以从该管道文件中读取写入的数据。
管道分为命名管道和匿名管道,其中管道文件属于命名管道,而之前使用的 | 则属于匿名管道。
使用mkfifo可以创建一个管道文件,示例如下,创建了一个名字为f的管道文件。
查看该文件信息,可以看到管道文件的类型使用p来表示,如下所示。管道文件在bash中是暗黄色的。
使用cat读入f的内容,并打印,其中 < 是重定向符号,它会将f作为cat的stdin。因为f是一个管道文件,此时f中没有内容,所以cat会等待。
在另一个虚拟终端上,使用echo命令,向f写入数据。
可以看到,cat从f中读到了123,并依次输出。
体会普通文件同管道文件的区别。
再次执行cat<f时,cat又会等待,并不会再输出123,因为123已经从管道中被取出来了。
如果用一个普通文件a替代f,执行cat < a,可以看到cat会立即输出a的内容,并不会等待,而且再次执行cat<a,还是会重复输出a的内容。
本节介绍文件权限的基础知识,在2.3.3节会介绍常用的文件权限操作命令。
使用ls-l查看到指定文件的权限,命令如下。
Linux文件的权限由一组权限位来表示,如上所示,/etc/profile的权限位是rw-r--r--,共分成3组:rw-、-r-、r--,自左向右分别代表文件的Owner(拥有者)、Group(组用户)、Other(其他用户)的权限。每组又有3个权限位,第一位是读(read)权限位,如果有read权限,则显示r反之则是-;第二位是写(write)权限位,如果有write权限,则显示w,反之则是-;第三位是可执行(execute)权限位,如果有执行权限,则显示x,反之则是-。
本例中Owner的权限位是rw-,说明Owner有读、写权限,没有可执行权限;Group的权限位是r--,说明Group用户有读权限,没有写权限和可执行权限;Other的权限位是r--,说明Other用户有读权限,没有写权限和可执行权限。
ls-l除了打印权限位信息外,还打印了:文件的Owner信息,就是第一个root的位置,该文件的Owner是root用户;文件的Group信息,为第二个root的位置,该文件的组用户为root。
注意: 初学者刚开始接触Linux时,经常会碰到Permission denied的提示,这就是典型的权限问题。解决的办法是,先使用id显示当前用户信息,确定当前用户;再用ls -l查看文件的权限位、Owner和Group信息,确定当前用户到底是属于哪一组权限位,是Owner、Group,还是Other,确定后,找到对应的那组权限,就可知当前用户是否有操作该文件的权限了。
目录也是文件,它的x权限位不是表示可执行,而是表示是否可以进入,即是否可以使用cd对其操作,如果有x权限,则可以cd切换到该目录,如果没有,则不允许cd切换到该目录。