在进入文件操作之前,首先引入Linux中的一个重要概念:Linux下一切皆文件


这句话很好理解,就是它的字面意思。在Linux系统中,目录是一种文件,快捷方式是一种文件,硬件设备(硬盘,U盘,鼠标,光驱;打印机等等)是文件,连命令也是文件。这是因为Unix哲学(Unix philosophy)中将文本流作为程序之间的通用接口,而文本流的载体自然就是文件了。

Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是通用的接口。

--quoted in A Quarter Century of Unix

所以Linux中所谓的扩展(extension)只是为了帮助了解该文件的用途,不会发生改了扩展名程序就运行不了的情况(控制台环境下,图形界面情况下,linux就是一个简易版Windows)。一个linux文件能不能被执行,只与执行者拥有的权限和文件内是否有可被对应程序执行的数据有关,与文件名根本一点关系都没有。


文件是linux系统的基石,而linux又有众多的发行版,如果每发行版都用自己的想法来配置文件放置的目录,那换一个发行版就和换了一个系统一样。在早期的UNIX系统中,各个厂家各自定义了自己的UNIX系统的文件系统构成,局面比较混乱。有鉴于此,Linux在面世不久就开始了对文件系统进行标准化的活动,经过多年的发展,有了现在的 Filesystem Hierarchy Standard (FHS) 标准,目前的最新版本为2004年发布的2.3 (可前往 http://www.pathname.com/fhs/ 查看)。


目录结构

Linux 的文件系统采用了级层式的树状目录结构,其中最上层是根目录 (root, /),  其他所有目录都包含在根目录中。目录树(directory tree) 结构示意图如下:


wKioL1NO9_fQjIbHAABWaPvBCp8991.jpg

目录树起始点为根目录 (root, /), 除了表示根目录,"/" 同时也是目录名的分隔符。比如到达patrick这个目录的路径为 /home/patrick,其中第一个 "/" 表示根目录,第二个 "/" 则是用来分隔home目录和patrick目录。

注:root这个词在linux中的意义很多,如果以账号的角度看,所谓的root指的是 “超级用户” 或者叫 “系统管理员” 的身份,这里以 “目录” 的角度看,root指的是根目录。


上图中列出了根目录下的五个子目录,事实上FHS规定了13个根目录下的次级目录,并对其中 /var 和 /usr 两个目录行进了更详细的定义,这里只是简要说明一下,有个大致概念就行了。


/usr: 放置Unix软件资源 (Unix Software Resource), 所有系统默认的软件 (distributions 发布者提供的软件)都放置在这里,类似Windows中的 "C:\Windows\ + C:\Program files\" 综合体,一般来说是占用硬盘容量最多的目录。


/var: variable的缩写,放置系统运行产生的文件,比如log,mysql数据库的文件等。


/bin: 放置能够被所有用户使用的可执行文件 (binary 二进制文件), 我们知道系统其实仅认识且可执行的是二进制文件。

/sbin: 放置重要的系统文件,仅供root用户使用, 与bin相比,多出来的那个 s 代表 superuser


/boot: 放置开机会用到的文件


/dev: 放置设备文件 (devices)


/etc: 放置各类配置文件 (etcetera 附加物)


/home: 放置出 root 外的所有用户主目录,~代表当前登陆用户的主目录, ~user1代表user1的主目录,就相当于/home/user1/

/root: root的主目录


/lib: 放置开机时会用到的函数库,以及 /bin 和 /sbin 下指令会呼叫的函数库


/media: 当你插入一个可移动设备时(U盘,SD卡,DVD等),系统会通过这个目录下对应的子目录来读取设备,这就是所谓的挂载 (mount)

/mnt: 挂载 (mount) 的缩写,这个目录是/media的前身,有了/media之后, 这个目录常就被用于临时挂载了


/opt: 用于放置加载项 (add-ons), 也就是第三方软件(非distribution提供的),不过习惯于放在 /usr/local 下


/proc: 放置系统运行信息,如进程信息 (process) , 他的数据都放在内存中,所以不占用任何硬盘空间


/tmp: 放置临时文件 (temporary),应定期清理,不可放置重要文件,FHS甚至建议在每次开机时将/tmp目录清空



事实上,每个放行版针对FHS都有异同,毕竟FHS只是一个参考标准,但差异有限。