文件系统
概述
除了计算功能,最重要的功能就是存储和组织功能。文件系统是一套实现了存储、分级组织、访问和获取等操作的抽象数据类型。
常见的文件系统:
-
FAT文件系统
在U盘和嵌入式设备等场景用流行。
-
NTFS文件系统
微软Windows使用此种文件系统NTFS(新技术文件系统)。
-
EXT文件系统
EXT(Extened File System,拓展文件系统)是Linux内核所做的第一个文件系统。 EXT4是Linux官方建议默认文件系统。
-
VFS文件系统
Linux操作系统还支持多种文件系统。然而用户并不需要关心操作系统的具体操作过程,为了使所有文件系统采用统一的文件界面,用户可以通过文件的操作界面来实现对不同的文件系统的操作。Linux操作系统引入了VFS(Virtual File System,虚拟文件系统)系统。
VFS是内核中的一个程序,在系统启动时启动,负责管理所有支持的文件系统,并向上层应用程序提供文件系统接口,用户并不需要关心其操作的文件属于怎样的文件系统,VFS会自动进行相应文件的读取工作。
目录与路径
目录可以想象的比喻为文件夹。目录可以存放文件和其他目录。通过目录构成的层次,达到组织的存储文件的目的。文件系统中的每个目录或文件都有一个唯一的确定的位置,找到该位置所历经的线路成为路径。
文件系统层次结构标准
Linux发行的版本非常多,但是几乎所有发行版本的目录配置都是相似,这得益于Linux目录配置标准(Filesystem Hierarchy Standard,HFS)的制定。
FHS最早与1993年制定,名字是FSSTND,目的是针对Linux操作系统,重整目录结构和文件,规范每个特定目录下应该存放的数据。经过多年的发展,目前需要类UNIX操作系统也是用FHS作为其目录标准结构,同时标准的名称修改为“文件系统层次结构标准”。FHS 3.0标准制定与2015年,大体内容如下表格。
目录 | 描述 |
---|---|
/ | 第一层次结构的根,整个文件系统层次结构的根目录 |
/bin | 需要在单用户模式可用的必要命令(可执行文件) |
/boot | 开机引导文件,包含Linux内核文件、开机菜单与开机所需配置文件等 |
/dev | 硬件设备或接口设备的抽象文件,访问该目录下的文件就是访问相应的设备 |
/etx | 系统主要的配置文件存在该目录中 |
/home | 用户的主目录,包含保存的文件、个人设置等 |
/lib | /bin和/sbin中的命令会调用的函数库 |
/media | 可移除媒体(如CD-ROM)的挂载点 |
/mnt | 临时挂在的文件系统 |
/opt | 第三方应用程序放置的目录 |
/proc | 虚拟文件系统,将内核与进程状态归档为文本文件 |
/root | 超级用户的根目录 |
/sbin | 必要的二进制文件 |
/srv | 站点的具体数据,由系统提供 |
/tmp | 临时文件,在系统重启时目录中文件不会被保留 |
/usr | 用于存储只读用户数据的第二层次;包含绝大多数的用户工具和应用程序 |
/var | 在正常运行的系统中其内容不断变化的文件,如日志、脱机文件和临时电子邮件文件 |
/run | 自最后一次启动以来运行中的系统信息 |
上述只是部分标准,具体内容可以参照Linux基金会Wiki网站。FHS标准北非是强制标准,因此在不同的发行版本中具体的目录结构可能会与FHS标准略有不同。
目录树
在Linux操作系统中,所有的文件与目录都是从根目录/
开始的,通过目录一级一级地分治,形成树枝状,称为目录树。
目录树具有以下几个特点:
- 目录树的起点是根目录,且只有一个根目录
- 其他设备(如U盘,网络上的文件系统)的起点依然是根目录,通过“挂载”操作挂载到某个特定的文件夹下,称为目录树的一部分
- 每个文件在目录树中的完整路径是唯一的
在Windows操作系统中也有目录树的概念,不同的是,Windows根据硬盘分区数量会有多个根,如‘’‘C:\’“D:\”,而Linux只有一个根
特殊目录符号
为了方便地在各目录中进行跳转,Linux操作系统已用了一些特殊的目录。
目录 | 释义 |
---|---|
. | 代表当前目录 |
.. | 代表上层目录 |
- | 代表上一个工作目录 |
~ | 代表当前登录账号的主目录 |
~ account | 代表account账号的主目录(需要把account修改为具体的用户名) |
相对路径和绝对路径
根目录是所有目录的起点,任何一个文件或目录都以根目录起存在一个唯一的路径,该路径成为绝对路径。绝对路径是从根目录开始的。
与绝对路径相对的是相对路径,相对路径不是从根目录开始的,而是以当前的工作目录为参照,从当前目录到达所需目录或文件所经过的线路称为相对路径,相对路径的开头一般是特殊目录符号。
绝对路径和相对路径的表示及使用方法如下所示。
- 使用cd命令切换绝对路径
-
使用cd命令切换相对路径
PATH环境变量
通常在当前工作目录下的程序(命令)可以直接在bash中执行,其他目录的程序需要输入完整的路径才可运行,但是像ls
命令,进入是在/bin
目录下,依然可以在任意目录中执行,其原因就是PATH环境变量中已经设置的/bin
目录。
PATH环境变量中保存了一些目录的路径,执行命令时,回先在当前工作目录中查找该命令是否存在,如果存在即执行,如果不存在,会在PATH环境变量定义的目录中查找该命令,并执行找到的第一个相匹配的命令。
-
显示PATH环境变量内容
注意PATH要大写
-
添加路径到PATH环境变量
不同用户默认的PATH内容是不同的;在终端中修改的PATH内容在是终端关闭后即失效。
目录管理
虽然文件系统都能确保文件内容的完整性,但是目录与文件的管理、组织依然需要用户来进行操作,本节内容就将介绍Linux操作系统如何在终端进行目录管理。
显示当前工作目录
进行目录管理前,首先需要知道当前所处目录(当前工作目录),Linux中提供了pwd(print working directory)
命令来执行该操作。
-
使用pwd命令显示当前工作目录
-
使用help命令查看pwd命令的帮助信息
查看目录与文件
Linux操作系统提供了强大的ls命令来显示某个路径下的文件和目录,其常用选项如下
-a: 显示当前目录下所有文件,包括隐藏文件和'.'','..'两个特殊目录
-A: 与-a相比不显示'.'','..'两个特殊目录
-h: 以方便阅读的形式显示文件单位
-i: 显示文件的节点信息
-l: 显示文件的详细信息
-R: 递归显示目录及其子目录的内容
-S: 按文件大小从小到大排序显示
-t: 按修改时间顺序排列,最新的在前边
-
使用-l显示文件详细信息
-
以方便阅读的形式显示文件
执行-l选型显示文件的详细信息时,会显示文件的大小,但是大小单位是Byte,需要进行换算才可以知道具体文件的大小,-h选项可以在输出详细信息是将单位转换为方便阅读的格式。
-
使用-l选项查看文件尺寸
-
使用-h选项方便阅读
-
-
按文件大小排序
如果想找出目录中比较大的文件或目录,可以使用该选项。除了按文件的大小排序,还可以支持修改时间、文件名字母等方式排序。
常用目录操作
在计算机的使用过程中,不可避免要进行新建、复制、移动(剪切)、删除等操作,通常通过鼠标右键快捷菜单中可以快速执行这几种操作。在Linux终端中,同样有相对应的命令来进行这些操作,而且功能更加强大。
-
新建目录
目录能够将文件分类,新建牧是一个计算机经常进行的操作。在Linux终端中,使用mkdir命令进行创建。
-
使用mkdir创建新文件夹
-
使用mkdir -p选项创建多级目录
使用-p选项可以构建多级目录
-
-
复制目录
复制文件使用cp命令即可,该命令除了复制功能外,还可以创建链接文件(创建快捷方式)、对比两个文件的新旧再进行更新、复制目录等。复制目录时常用到-r选项递归复制源目录下的所有内容,适用方法如下。
-
适用cp命令-r选项递归复制目录及其内容
-
-
移动目录
mv命令可以执行文件或目录的移动操作,和cp命令一样,可以先测试目标文件的心就,提示用户是否需要移动。除此之外,还可以利用mv命令来对目录或文件进行重命名。
-
使用mv修改文件名
-
使用mv移动目录
-
-
删除目录
rm命令用来删除文件和目录。该命令比较简单,功能也比较有限,但是十分重要。
- 使用rm命令-r选项递归删除指定目录
文件管理
Linux操作系统秉承着一切且文件的哲学思想,将目录、硬件设备、网络接口等全部抽象成了文件,所有的任务都由专门的文件负责。这导致在Linux操作系统中,文件种类非常多,对文件的操作的过程也不同。
文件类型
- 常见的文件类型
名称 | 符号 | 描述 |
---|---|---|
普通文件 | - | 按照文件内容,大致可以分为:纯文本文档、二进制文件、数据格式文件 |
目录 | d | directory文件夹 |
链接文件 | l | link快捷方式 |
块设备 | b | block硬盘、U盘、SD卡等设备 |
字符设备 | c | character一些串口端口的接口设备,如鼠标、键盘 |
套接字 | s | sockets数据接口文件、常用在网络上的数据连接 |
管道 | p | pipe主要目的在于解决多个程序同时访问一个文件造成的错误问题,是一种先进先出的队列 |
-
使用file命令查看文件类型
除了使用ls查看文件类型外,还可以使用file
管道
管道是一系列将标准输入输出连接起来的进程,其中上一个进程的输出被直接作为下一个进程的输入。Linux系统中有匿名管道和命名管道两种管道。匿名管道在终端环境下经常被用来连接两个或多个命令,实现一些组合功能,匿名管道用符号|
表示,将前一个命令的输出导出作为下一个命令的输入参数。
-
使用管道连接符连接ls和grep两个命令
-
使用mkfifo命令创建管道
命令管道一般称为FIFO(First in First Out,先进先出)。创建FIFO可以使用mkfifo命令。
新建文件
在计算机使用过程中,需要创建很多文件,用来保存运行日志、用户数据等。在Windows环境下一般采用右键快捷菜单创建新文件即可,在Linux中终端中,提供了多种创建新文件的方式,下面简单介绍几种常用的创建新文件的方法。
-
使用touch命令创建文件
touch命令的作用是修改文件访问时间为当前时间,但是当被操作文件不存在时,touch命令会自动创建一个空白文件,实现方法如下。
-
使用touch命令修改访问时间
-
使用touch命令创建文件
-
-
文本编辑器创建
nano编辑器,当时用nano编辑器打开文件时,如果文件存在,则直接打开;如果不存在,则nano会自动创建文件之后打开。利用该特性,可以实现新文件的创建。
-
重定向方式创建文件
通常情况下,命令的执行结果会显示在终端界面中,终端关闭后,结果也就不复存在。可以使用重定向方式来创建一个文件并保存命令执行结果。Linux提供了
>
和>>
两种操作符进行重定向,这两个操作符的区别如下:>
操作符:当目标文件已存在时,输出的内容覆盖源文件中已有的内容。>>
操作符:当目标文件已存在时,会将新内容自动追加到源文件内容的后面。
在使用重定向符号创建文件时,可以注意到使用双引号将文件名括取来,原因就是其中
>
这个特殊符号,在之后的使用中如pp_\>.txt
,在符号>
之前添加\
符号,作用是让终端知道>
符号在这里只是一个字符符号,而不执行重定向功能。 通常Linux系统中对文件名并没有特殊要求,除
NULL(\0)和/
之外,所有字符都可以。但是由于Linux终端有很多指令操作符,所以在创建新文件时,文件名中最好能够避免一些特殊字符。
复制、移动、删除文件
前面已经演示了如何使用cp、mv、rm命令对目录进行复制、移动、删除,本节将介绍如何使用这些命令来对文件进行操作。
-
复制文件
Linux中的cp命令除了可以为源文件创建一个文本附件外,还提供了其他一些选项,比如创建符号链接、保留源文件或目录的属性、备份文件等。
-
使用cp命令复制文件
-
使用cp命令创建快捷方式
-
使用cp命令-p选项复制文件的完整属性
使用cp命令复制文件时,正常情况下只会复制文件内容, 而不会复制文件的属性,所以前面提到的目标文件修改时间要比源文件晚,不仅是时间信息,复制的文件不同,属性相差也会比较大,这样就造成了折执行文件复制后没有执行权限,为了解决这个问题,cp提供了-p选项,该选项能够复制源文件的属性和内容。
-
-
移动文件
类似于Windows平台的剪切和黏贴操作,可以将一个文件从一个地方移动到另外一个地方。Linux平台的mv指令除最基础的移动功能外,还提供了一些其他命令的选项。
-
使用mv命令移动文件
-
使用mv命令-i选项移动文件时会提示是否覆盖
通常如果目标文件存在,则mv命令会直接将其覆盖掉,使用mv -i选项则会在覆盖前询问用户是否覆盖,防止意外情况的出现。
-
使用mv命令-b选项移动文件时会自动备份重名文件之后直接移动
备份的文件后面添加了~符号
搜索文件
-
随着计算机使用的增多,计算机中文件的数量越来越多,很多时候需要查找功能才能找到想要的文件,Linux提供了多个使用的命令来查找文件,比如which、locate、find等。
-
which命令
终端中的大多数命令保存在PATH环境变量指定的目录下,但是某些具体命令在哪个目录下,就不是那么明显了,所以Linux系统提供了which命令来查找某个命令的具体位置。
-
locate命令
which命令只能查找命令,但是在大多数情况下被查找的都是一些文档等内容,此时可以使用locate命令查找文档。
- 使用locate命令查找文档路径
-
使用locate命令-c选项输出查找到的文件的个数
-
使用locate命令-l选型输出查找到的前n个文档
输出找到的前5个文件
locate -r 选型支持使用正则表达式,有关正则表达式的内容会在后续章节进行讲解,此处不再演示。
-
find命令
相比于locate命令,find命令功能要强大的多,但是由于其搜索时直接在硬盘上,所以速度要慢。
-
使用find命令查找最近三天修改过的文件
除了mtime修改时间选型外,还有atime(访问时间)、ctime(状态改变时间)、newer(相对某文件更新的时间)等时间选项。示例中的-3,代表三天内,如果是+3,则代表三天前。
-
查找某路径下属于某用户(此处为pp)的所有文件
find /home -user pp # 命令 路径 用户选型 用户名
-
根据文件名查找文件路径
-
查找当前目录下所有的管道类型文件
注意:find命令在查找文件名时,是精确匹配的,需要输入完整文件名才可以,在文件名不确定的情况下,可以使用通配符进行匹配。
-
显示文件内容
在Linux操作系统中,与用户关系较密切的文件大多是文本文件,比如配置文件、日志文件、代码文件等,如何查看这些文件使用户必须掌握的一项技能。查看文件主要使用的是cat命令,还有一切其他命令能够实现不同的查看模式,例如more、less、grep。
cat命令
cat命令的作用是将两个或两个以上的文件内容拼接起来并输出到终端,配合上文的重定向操作符可以实现多个文件的合并。当cat命令只包含一个文件时,就实现了将这一个文件内容输出到终端后窗口。
-
使用cat命令拼接两个文件
-
使用cat命令查看文件内容
-
使用cat命令-n选型查看文件内容及行号
在上述输出内容中,由于文件较短,直接输出在终端可显示全部内容,这种方法简单快捷。但是当文件内容较长时,且在纯文本字符窗口时,树表示无法使用的,此时屏幕上智慧显示最后几行的内容,无法查看完整内容,这是不能接受的。下面继续介绍如何实现对文件内容的分屏显示。
more命令
接下以.bashrc文件为例,演示当文件内容较长时,如何分页显示。.bashrc文件的绝对路径是/home/用户名/.bashrc
,该文件保存在用户对应的home目录中,主要存放用户环境变量设定、个性化设定、命令别名等内容,只对相应的用户起作用,对别的用户没有影响。
当显示较长的文件时,cat命令只会显示最后一部分内容,如果想查看上边输出的那部分内容,可以使用more命令来进行内容分页,之后采用翻页的方式查看完整的内容。more命令使用方法如如下。
-d : 输出内容时同时显示常用的快捷键
-f : 计算逻辑行数,而非屏幕行数
-l : 屏蔽换页后的暂停
-c : 不滚动,显示文本并清理行末
-p : 不滚动,清理屏幕并显示文本
-s : 将多行空行压缩为一行
-u : 屏蔽下划线
-<数字> : 指定每屏显示的行数
+<数字> : 从指定行开始显示文件
+/<字符串> : 从匹配搜索字符串的位置开始显示文件
进入more环境后,可以通过以下快捷键进行操作
空格键 : 下一屏
B键 : 上一屏
回车键 : 下一行
/ : 斜线后输入字符串,可以在文本中查找下一个匹配的字符串位置并显示
q : 退出more命令
less命令
相对于cat命令,more命令已经足够强大,但是其操作逻辑不是特别的人性化,比如对于管道文件等只能查看之后的内容,无法查看已经看过的内容。与more相比,less的使用更加弹性化,功能也更加强大。对于大文件,less不需要将文件内容一次性读入到内存中,所以打开更快、操作更流畅。less常用快捷键和more相同。
less .bashrc
head、tail命令
如果指向查看文件的前几行或者后几行内容,利用以上几个命令输出全部内容很显然是非常麻烦的,此时可以使用head/tail命令来输出前几行或者后几行内容。
head 命令常用选项
-n : 指定输出的行数
-c : 指定输出的字符数
-
输出.bashrc文件前5行内容
-
输出.bashrc文件前100个字符
tail命令常用选项
-n : 指定输出的行数
-f : 持续监测文件内容,如果目标文件有新的输入,则将新增加的内容输出
-
输出文件的最后15行内容
-
输出文件第115行至最后
grep命令
前面的内容介绍了一些文件显示方法,但是很多时候并需要显示所有内容,而需要显示指定的内容,Linux同样提供了一些强大的工具来实现这些需求。
grep命令是一个非常强大的文本处理命令,主要功能是根据关键词对文本内容进行筛选,查找匹配指定关键词的行并输出,grep命令提供了很多常用选项
-a: 不要忽略二进制数据
-b: 除显示查找到的行号外,还显示匹配字符所在的整个文档的位置
-c: 显示匹配关键词的内容的行数合计
-e: 指定关键词,使用该选项可以指定讴歌关键词
-E: 指定正则表达式
-i: 查找是不区分大小写
-n: 显示匹配行的行号
-w: 显示和关键词完全匹配的内容
-o: 只输出文件中匹配到的内容
-
搜索.bashrc文件中包含if的内容
-
不检查大小的搜索
-
输出包含关键词的内容共有多少行
-
关键词完全匹配
-
输出关键词匹配行在文件中的行号
-
只输出匹配的内容,不输出整行内容
除了可以搜索文本内容外,grep还可以和管道符搭配,将其他命令输出的结果当做输入进入后续处理,前面的章节已经使用过该方法,再此处只进行简单介绍。
-
使用管道连接符连接ls和grep命令实现关键词筛选
文件压缩与备份
当文件需要传输、发送邮件的时候,经常需要将多个文件压缩为一个压缩包,然后再践行传输,这样不仅数量减少、大小也会变小,方便文件的传输和存储。Linux平台上提供了许多命令来完成压缩、解压的操作。
文件压缩原理
文件压缩技术通过一定的算法,将文件传输内容进行可恢复的压缩,多个文档要在一起还可以起到归档作用。也可以将一个大文件在压缩时分割成一定大小的压缩包,解压时再合并为一个压缩包进行解压,方便刻录光盘等。
文件压缩大体可以分为有损压缩和无损压缩,算法有很多。在此不介绍了。
gzip压缩命令
gzip是GUN计划的一部分,一般认为是GUN zip的缩写。gzip是一个应用较广泛的命令,可以实现文件的压缩与解压缩,常用的命令选项有如下几个。
-c : 将压缩的内容输出到屏幕上,源文件保持不变,可以通过重定向处理输出的内容
-d : 解压缩文件
-l : 输出压缩包内存存储的原始文件信息,如解压缩后的文件名、压缩率等
-# : 指定压缩等级,可以分为1~9,压缩率一次增大,速度依次减慢,默认压缩等级为6
-
使用gzip命令压缩文件
-
使用gzip命令对压缩文件进行解压缩
bzip2压缩命令
bzip2在使用方法上与gzip基本一致,命令选项也基本一致,此处不再一一列出。示例代码如下所示:
- 使用bzip2命令进行文件压缩
-
使用bzip2命令对压缩文件进行解压缩
-
使用biz2命令进行文件压缩并保留源文件
注意:由于bzip2的压缩率比gzip的压缩率要高一些。
tar归档命令
前面介绍的gzip和bzip2两个命令只能对单文件进行压缩,并不能将多个文件压缩为一个压缩包。这具有很大局限性。tar命令可以将多个文件合并为一个压缩包,但是该命令没有压缩功能,需要与gzip和bizp2一同使用来实现文件的压缩和打包。tar命令常用选项如下
-c: 新建打包文件
-t: 查看打包文件中包含哪些文件
-x: 解包文件包
-j: 通过bzip2的支持进行压缩/解压缩
-z: 通过gizp的支持进行压缩/解压缩
-C: 指定解包目标路径
-p: 打包过程中保留源文件的属性和权限
-v: 输出打包过程中正在处理的文件名
-
使用tar命令打包文件夹
-
使用tar命令查看打包后压缩包的内容
-
使用tar命令对打包文件进行解包和解压缩
-
使用tar命令备份/etc目录
经常使用tar命令备份系统/etc目录是一个很好的习惯
上述图片的文件名均以etc开头,而不是/etc。
使用tar命令备份文件时,默认采用相对路径进行文件保存,如果需要采用绝对路径可以使用“-P”选项,但是一般不推荐使用绝对路径保存,因为当解压缩该文件时可能会造成解压出的文件直接覆盖掉相应位置的文件,导致系统崩溃等。所以在如上事例中,在绝对路径进行打包且没有使用“-P”选项是,tar命令默认去掉‘’/‘’,将绝对路径变成相对路径。