Linux 文件系统简介

在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。

在 Linux 系统中有一个重要的概念:一切都是文件。其实这是 Unix 哲学的一个体现,而 Linux 是重写 UNIX 而来,所以这个概念也就传承了下来。在 UNIX 系统中,把一切资源都看作是文件,包括硬件设备。UNIX 系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问

Linux 目录结构

目录结构:

Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录

image.png

目录说明:

  • /root: 超级用户(系统管理员)的主目录;
  • /bin: 存放二进制可执行文件(ls、cat、mkdir等),常用命令一般都在这里;
  • /etc: 存放系统管理和配置文件;
  • /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;
  • /usr : 用于存放系统应用程序;
  • /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
  • /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
  • /root: 超级用户(系统管理员)的主目录;
  • /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
  • /dev: 用于存放设备文件;
  • /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
  • /boot: 存放用于系统引导时使用的各种文件;
  • /lib : 存放着和系统运行相关的库文件 ;
  • /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
  • /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
  • /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。

Linux 文件类型

常见的文件类型及其含义有:

  • d:目录
  • -:普通文件
  • l:链接文件
  • c:字符设备文件
  • b:块设备文件

Linux 文件权限

用户分为三种:

  • 文件拥有者(ower)
  • 群组(group)
  • 其它人(other)

对不同的用户有不同的文件权限。

文件权限字段一共有 9 位。每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。

文件权限字段的八进制模式

权限 二进制值 八进制值
—- 000 0
—x 001 1
-w- 010 2
-wx 011 3
r— 100 4
r-x 101 5
rw- 110 6
rwx 111 7

修改权限

使用八进制模式修改权限命令:

  1. chmod [-R] xyz dirname/filename

示例:将 .bashrc 文件的权限修改为 -rwxr-xr—。

  1. chmod 754 .bashrc

也可以使用符号来设定权限。

  1. # chmod [ugoa] [+-=] [rwx] dirname/filename
  2. - u:拥有者
  3. - g:所属群组
  4. - o:其他人
  5. - a:所有人
  6. - +:添加权限
  7. - -:移除权限
  8. - =:设定权限Copy to clipboardErrorCopied

示例:为 .bashrc 文件的所有用户添加写权限。

  1. chmod a+w .bashrc

Linux 文件属性

使用 ls 查看一个文件时,会显示一个文件的信息,例如

drwxr-xr-x 3 root root 17 May 6 00:14 .config

对这个信息的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段(这里是 d),后 9 位为文件权限字段(rwxr-xr-x)
  • 3:链接数
  • root:文件拥有者
  • root:所属群组
  • 17:文件大小
  • May 6 00:14:文件最后被修改的时间
  • .config:文件名

目录的基本操作

1. ls

列出文件或者目录的信息,目录的信息就是其中包含的文件。

  1. # ls [-aAdfFhilnrRSt] file|dir
  2. -a :列出全部的文件
  3. -d :仅列出目录本身
  4. -l :以长数据串行列出,包含文件的属性与权限等等数据

2. cd

更换当前目录。

  1. cd [相对路径或绝对路径]

3. mkdir

创建目录。

  1. # mkdir [-mp] 目录名称
  2. -m :配置目录权限
  3. -p :递归创建目录

4. rmdir

删除目录,目录必须为空。

  1. rmdir [-p] 目录名称
  2. -p :递归删除目录

5. pwd

显示当前所在位置。

文件的基本操作

1. touch

更新文件时间或者建立新文件。

  1. # touch [-acdmt] filename
  2. -a : 更新 atime
  3. -c : 更新 ctime,若该文件不存在则不建立新文件
  4. -m : 更新 mtime
  5. -d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"
  6. -t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]

2. cp

复制文件。如果源文件有两个以上,则目的文件一定要是目录才行。

  1. cp [-adfilprsu] source destination
  2. -a :相当于 -dr --preserve=all
  3. -d :若来源文件为链接文件,则复制链接文件属性而非文件本身
  4. -i :若目标文件已经存在时,在覆盖前会先询问
  5. -p :连同文件的属性一起复制过去
  6. -r :递归复制
  7. -u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
  8. --preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了

3. rm

删除文件。

  1. # rm [-fir] 文件或目录
  2. -r :递归删除

4. mv

移动文件。

  1. # mv [-fiu] source destination
  2. # mv [options] source1 source2 source3 .... directory
  3. -f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖

5. vim

文本编辑器。

  • 按下 “i” 等按键之后进入,可以对文本进行编辑;
  • 按下 “:” 按键之后进入,用于保存退出等操作。
    以下命令用于离开或者保存文件:| 命令 | 作用 | | :—-: | :—-: | | :w | 写入磁盘 | | :w! | 当文件为只读时,强制写入磁盘。到底能不能写入,与用户对该文件的权限有关 | | :q | 离开 | | :q! | 强制离开不保存 | | :wq | 写入磁盘后离开 | | :wq! | 强制写入磁盘后离开 |

获取文件内容

1. cat

取得文件内容。

  1. # cat [-AbEnTv] filename
  2. -n :打印出行号,连同空白行也会有行号,-b 不会

2. tac

是 cat 的反向操作,从最后一行开始打印。

3. more

和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看。

4. less

和 more 类似,但是多了一个向前翻页的功能。

5. head

取得文件前几行。

  1. # head [-n number] filename
  2. -n :后面接数字,代表显示几行的意思

6. tail

是 head 的反向操作,只是取得是后几行。

文件搜索

1. whereis

文件搜索。速度比较快,因为它只搜索几个特定的目录。

  1. # whereis [-bmsu] dirname/filename

2. locate

文件搜索。可以用关键字或者正则表达式进行搜索。

locate 使用 /var/lib/mlocate/ 这个数据库来进行搜索,它存储在内存中,并且每天更新一次,所以无法用 locate 搜索新建的文件。可以使用 updatedb 来立即更新数据库。

  1. # locate [-ir] keyword
  2. -r:正则表达式

3. find

文件搜索。可以使用文件的属性和权限进行搜索。

  1. # find [basedir] [option]
  1. # examples:
  2. find -name "target.java" # 当面目录下查找文件
  3. find / -name "target.java" # 根目录下查找文件
  4. find ~ -name "target.java" # /home 目录下查找文件
  5. find ~ -name "target.*" # /home 目录下查找文件(模糊查询)
  6. find ~ -iname "target.java" # /home 目录下查找文件(忽略大小写)