# 第三阶段：文件系统与文本处理

## 文件系统

一种不同是体现在目录与存储介质（磁盘，内存，DVD 等）的关系上，以往的 Windows 一直是以存储介质为主的，主要以盘符（C 盘，D 盘...）及分区来实现文件管理，然后之下才是目录。

然而 UNIX/Linux 恰好相反，UNIX 是以目录为主的，Linux 也继承了这一优良特性。 Linux 是以树形目录结构的形式来构建整个系统的，可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的，但从逻辑上来说 Linux 的磁盘是“挂在”（挂载在）目录上的，每一个目录不仅能使用本地磁盘分区的文件系统，也可以使用网络上的文件系统。举例来说，可以利用网络文件系统（Network File System，NFS）服务器载入某特定目录等。Tip：目录是文件系统中的一个概念，因为目录本身也是文件，叫做目录文件，简称目录。在图形用户界面中，目录被表示为文件夹。主要区别在于，文件夹是一个逻辑概念，不一定映射到物理目录。目录是文件系统对象，而文件夹是图形用户界面对象。

若指代文档的容器，使用“文件夹”一词更为贴切。而“目录”一词则指代计算机上存储文档文件和文件夹的结构化列表方式，类似于电话簿包含姓名、号码和地址的列表，但并不包含实际文档本身。

在 Windows 系统中，文件夹 $\mathbf { \bar { \mathbf { \tau } } } = \mathbf { \tau } _ { \cdot }$ 虚拟文件夹 $^ +$ 文件系统目录。

## FHS 定义

FHS 定义了两层规范，第一层是，/下面的各个目录应该要放什么文件数据，例如/etc 应该放置设置文件，/bin 与/sbin 则应该放置可执行文件等等。

第二层则是针对 /usr 及/var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件，/usr/share 放置共享数据等等。

![](5a0420fefef9e200b0d0038ac63a507d8d857db101a28ff6f1c8ed2f69eb23b0.jpg)

将目录定义为四种交互作用的形态，如下表所示：

<table><tr><td></td><td>可分享的shareable)</td><td>不可分享</td></tr><tr><td rowspan="2">不可变的(static)</td><td>/usr(软件放置处)</td><td>/etc(配置)</td></tr><tr><td>/opt(第三方软件)</td><td>/boot(开)</td></tr><tr><td rowspan="2">可变动的(variable)</td><td>/var/mail(用户邮件信箱)</td><td>/var/run</td></tr><tr><td>/var/news(新闻组)</td><td>/var/log</td></tr></table>

## 路径

如果你想进入某个具体的目录或者想获得某个目录的文件（目录本身也是文件）那就得用路径来找到了。

使用cd 命令可以切换目录，在 Linux 里面使用. 表示当前目录，.. 表示上一级目录（注意，我们上一节介绍过的，以. 开头的文件都是隐藏文件，所以这两个目录必然也是隐藏的，你可以使用 ls -a命令查看隐藏文件）, - 表示上一次所在目录，～ 通常表示当前用户的 home 目录。使用 pwd 命令可以获取当前所在路径（绝对路径）。

## 绝对路径

关于绝对路径，简单地说就是以根" / "目录为起点的完整路径，以你所要到的目录为终点，表现形式如： /usr/local/bin，表示根目录下的 usr 目录中的 local 目录中的 bin 目录。

## 相对路径

相对路径，也就是相对于你当前的目录的路径，相对路径是以当前目录 . 为起点，以你所要到的目录为终点，表现形式如： usr/local/bin （这里假设你当前目录为根目录）。你可能注意到，我们表示相对路径实际并没有加上表示当前目录的那个 . ，而是直接以目录名开头，因为这个 usr 目录为/目录下的子目录，是可以省略这个 . 的（以后会讲到一个类似不能省略的情况）；如果是当前目录的上一级目录，则需要使用.. ，比如你当前目录为/home/shiyanlou 目录下，根目录就应该表示为../../ ，表示上一级目录（home 目录）的上一级目录（/ 目录）。

## 文件类型

普通文件 ( - )

目录 ( d )

符号链接 ( l )

字符设备文件 ( c )

块设备文件 ( b )

套接字 ( s )

命名管道 ( p )

普通文件仅仅就是字节序列，Linux 并没有对其内容规定任何的结构。

普通文件可以是程序源代码（c、 ${ \mathsf { C } } ^ { + + }$ 、python、perl等）、可执行文件（文件编辑器、数据库系统、出版工具、绘图工具等）、图片、声音、图像等。

Linux 不会区别对待这些普通文件，只有处理这些文件的应用程序才会根据文件的内容赋予相应的含义。

在Linux环境下，只要是可执行的文件并具有可执行属性它就能执行，不管其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则。

目录文件是由一组目录项组成，目录项可以是对其他文件的指向也可以是其下的子目录指向。

一个文件的名称是存储在他的父目录中的，而并非同文件内容本身存储在一起。

硬连接文件实际上就是在某目录中创建目录项，从而使不止一个目录可以引用到同一个文件。这种链接关系由 ln 命令行来建立。

硬链接并不是一种特殊类型的文件，只是因为在文件系统中允许不止一个目录项指向同一个文件。

用户登录后，将会进入一个系统指定的专属目录，即用户的主目录，该目录名通常为用户的登录账号。如

用户 bigdata 的主目录为：/home/bigdata

在创建用户时，系统管理员会给每个用户建立一个主目录，通常在 /home/ 目录下。

用户对自己主目录的文件拥有所有权，可以在自己的主目录下进行相关操作。

每个用户名对应一个用户 ID 号（一个数字）；每个用户都被分配到一个指定的组 (group)中。

默认情况下 RHEL/CentOS 在创建用户的同时会创建一个和用户同名的私有组。

符号链接又称软链接，是指将一个文件指向另外一个文件的文件名。

这种符号链接的关系由 ln -s 命令行来建立。

硬链接

链接文件和被链接文件必须位于同一个文件系统内

不能建立指向目录的硬链接

软链接

链接文件和被链接文件可以位于不同文件系统

可以建立指向目录的软链接

设备文件

设备是指计算机中的外围硬件装置，即除了CPU和内存以外的所有设备。通常，设备中含有数据寄存器或数据缓存器、设备控制器，它们用于完成设备同CPU或内存的数据交换。

在 Linux 下，为了屏蔽用户对设备访问的复杂性，采用了设备文件，即可以通过象访问普通文件一样的方式来对设备进行访问读写。

设备文件用来访问硬件设备，包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。

设备文件分为：字符设备（如：键盘）和块设备（如：磁盘）。

设备的使用方法

用户可以用设备名来使用设备

用户可以用访问文件的方法来使用设备

设备名以文件系统中的设备文件的形式存在

所有的设备文件存放在/dev 目录下

几个特殊的设备

/dev/null －空设备

/dev/zero －零设备

Linux的目录结构

Linux 文件系统是一个目录树的结构，文件系统结构从一个根目录开始，根目录下可以有任意多个文件和子目录，子目录中又可以有任意多个文件和子目录。

Linux 的这种文件系统结构使得一个目录和它包含的文件/子目录之间形成一种层次关系。

大小写敏感

以“.”开头的文件或目录是隐含的

![](2c593a284b9247a11712bcf3e90b3d0fd57379c15277f13b41023975c749cd34.jpg)

## 文件操作

<table><tr><td>cat</td><td>查看文件内容</td><td>more/less</td><td>查看文件内容</td></tr><tr><td>cd</td><td>切换工作目录</td><td>touch</td><td>改变文件的时间属性</td></tr><tr><td>chown</td><td>改变文件属权</td><td>mv</td><td>改名或移动文件</td></tr><tr><td>chmod</td><td>改变文件权限</td><td>pwd</td><td>显示当前所在的目录</td></tr><tr><td>clear</td><td>清除屏幕</td><td>rm</td><td>删除文件或目录</td></tr><tr><td>cp</td><td>拷贝文件</td><td>find</td><td>查找文件</td></tr><tr><td>In</td><td>创建文件链接</td><td>which</td><td>寻找命令</td></tr><tr><td>Is</td><td>显示目录内容</td><td>tar</td><td>文件打包</td></tr><tr><td>mkdir</td><td rowspan="2">创建/删除空目录</td><td>[g]zip/unzip</td><td rowspan="2">文件压缩和解压</td></tr><tr><td>rmdir</td><td>7za</td></tr><tr><td>Tree</td><td>显示目录树</td><td></td><td></td></tr></table>

### 新建文件

使用touch 命令生成新的空文件或更改现有文件的时间，关于touch 命令，其主要作用是来更改已有文件的时间戳的（比如，最近访问时间，最近修改时间），但其在不加任何参数的情况下，只指定一个文件名，则可以创建一个指定文件名的空白文件（不会覆盖已有同名文件）

格式：touch [参数] <文件> …

参数

-a : 只更改访问时间。

-m : 只更改修改时间。

-t <STAMP> : 使用[[CC]YY]MMDDhhmm[.ss]格式的时间而非当前时间。

-r <参考文件或目录 $\mathrm { > }$ : 使用指定文件的时间属性而非当前时间。

GNU/Linux 文件的3种类型的时间戳：

mtime: 最后修改时间 (ls -lt)

ctime: 状态改变时间 (ls -lc)

atime: 最后访问时间 (ls -lu)

说明

ctime并非文件创建时间。

覆盖一个文件会改变mtime、ctime和atime三类时间。

改变文件的访问权限或拥有者会改变文件的 ctime 和 atime。

读文件会改变文件的atime。

### 新建目录

使用mkdir（make directories）命令可以创建一个空目录，也可同时指定创建目录的权限属性。

使用-p 参数，同时创建父目录（如果不存在该父目录）

Rmdir 删除目录（空目录）

### 复制文件

使用 cp 命令（copy）复制一个文件到指定目录。

cp test father/son/grandson

格式：cp [参数] <源> <目标>

说明

若复制的目标文件已存在，则被覆盖。

可以将多个源文件复制到目标目录中。

可以将源目录复制为指定的目标目录（目标目录不存在）。

可以将源目录复制到指定的目标目录中。

<table><tr><td>参数</td><td>说明</td></tr><tr><td>-a</td><td>等价于 -dpR</td></tr><tr><td>-R, -r</td><td>递归地复制目录及目录内的所有项目</td></tr><tr><td>-p</td><td>在复制文件过程中保留文件属性，包括属主、组、权限与时间戳</td></tr><tr><td>-d</td><td>当复制符号链接的源文件时，目标文件也将创建符号链接且指向源文件所链接的原始文件</td></tr><tr><td>-f</td><td>强制复制，不管目标是否存在</td></tr><tr><td>-i</td><td>交互式复制，覆盖文件前需要确认</td></tr><tr><td>-u</td><td>只有当源文件的状态改变时间（ctime）比目标文件更新时或目标尚不存在时才进行复制</td></tr></table>

### 复制目录

如果直接使用cp 命令复制一个目录的话，要成功复制目录需要加上 -r 或者-R 参数，表示递归复制，

就是说有点目录及其下面的子目录层层进入复制的意思。

### 删除文件

使用 rm（remove files or directories）命令删除一个文件

你如果想忽略这提示，直接删除文件，可以使用-f 参数强制删除：

### 删除目录

跟复制目录一样，要删除一个目录，也需要加上-r 或-R 参数：

### 移动文件

使用mv（move or rename files）命令移动文件（剪切）。命令格式是mv 源目录文件 目的目录。

### 重命名文件

mv 命令除了能移动文件外，还能给文件重命名。命令格式为mv 旧的文件名新的文件名。

### 批量重命名

要实现批量重命名，mv 命令就有点力不从心了，我们可以使用一个看起来更专业的命令 rename来实现。

Tree

显示目录树

判断文件类型

文件可以包含许多类型的数据

在打开前检查文件的类型来决定要使用的恰当命令或程序

命令

file [选项] <文件名>…

stat [选项] <文件名>…

ln命令

功能：创建链接文件。

格式：ln [参数] <被链接的文件> <链接文件名>

参数：

-s : 创建符号链接，而非硬链接。

-f : 强行创建链接，不论其是否存在。

-i : 覆盖原有文件之前先询问用户。

举例：

$\$ 1$ ln somefile hardlinkfile

$\$ 1$ ln -s somefile softlinkfile

$\$ 1$ ln -s somedir softlinkfile

## 标准输入输出

当我们执行一个 shell 命令行时通常会自动打开三个标准文件，即标准输入文件（stdin），默认对应终端的键盘、标准输出文件（stdout）和标准错误输出文件（stderr），后两个文件都对应被重定向到终端的屏幕，以便我们能直接看到输出内容。

进程将从标准输入文件中得到输入数据，将正常输出数据输出到标准输出文件，而将错误信息送到标准错误文件中。

前两个命令都是用来打印文件内容到标准输出（终端），其中 cat 为正序显示，tac 为倒序显示。可以加上-n 参数显示行号

用户登录后进入的目录通常是自己的主目录

可用 pwd 命令查看用户的当前目录

可用 cd 命令来切换目录

一些特殊字符的特殊含义：

“ .” 表示当前目录

“..” 表示当前目录的上一级目录（父目录）

“-” 表示用 cd 命令切换目录前所在的目录

“~” 表示用户主目录的绝对路径名

绝对路径

以斜线（/）开头

描述到文件位置的完整说明

任何时候你想指定文件名的时候都可以使用

相对路径

不以斜线（/）开头

指定相对于你的当前工作目录而言的位置

可以被用作指定文件名的简捷方式

常用的文本文件提取命令

<table><tr><td>命令</td><td>功能</td></tr><tr><td>cat、tac</td><td>滚屏显示文本文件内容</td></tr><tr><td>more、less</td><td>分屏显示文本文件内容</td></tr><tr><td>head、tail</td><td>显示文本文件的前或后若干行
(横向截取文本文件内容)</td></tr><tr><td>cut</td><td>纵向切割出文本指定的部分
(纵向截取文本文件内容)</td></tr><tr><td>grep</td><td>在文本文件中查找指定的字符串
(按关键字提取文本文件中匹配的行)</td></tr></table>

### cat 命令

真实功能命令的核心功能其实是读取输入并原样输出（concatenate 的缩写），它既能：

 输入侧：可以接受文件参数或stdin  
 输出侧：总是输出到 stdout（除非用 $>$ 重定向）

cat -n passwd

nl 命令，添加行号并打印

### 使用 more 和 less 命令分页查看文件

。其中more 命令比较简单，只能向一个方向滚动，而 less 为基于more 和vi （一个强大的编辑器，我们有单独的课程来让你学习）开发，功能更强大。less 的使用基本和 more 一致，具体使用请查看man 手册，这里只介绍more 命令的使用。

打开后默认只显示一屏内容，终端底部显示当前阅读的进度。可以使用 Enter 键向下滚动一行，使用Space 键向下滚动一屏，按下h 显示帮助，q 退出。

zless file1 分页显示压缩文本文件

### 使用 head 和 tail 命令查看文件

这两个命令，那些性子比较急的人应该会喜欢，因为它们一个是只查看文件的头几行（默认为 10 行，不足10 行则显示全部）和尾几行。还是拿passwd 文件举例，比如当我们想要查看最近新增加的用户，那么我们可以查看这个 /etc/passwd 文件，不过我们前面也看到了，这个文件里面一大堆乱糟糟的东西，看起来实在费神啊。因为系统新增加一个用户，会将用户的信息添加到 passwd 文件的最后，那么这时候我们就可以使用tail 命令了：

$\$ 1$ tail /etc/passwd

甚至更直接的只看一行， 加上-n 参数，后面紧跟行数：

$\$ 1$ tail -n 1 /etc/passwd

关于tail 命令，不得不提的还有它一个很牛的参数 -f，这个参数可以实现不停地读取某个文件的内容并显示。这可以让我们动态查看日志，达到实时监视的目的。

下一步

我们可以使用file 命令查看文件的类型：

说明这是一个可执行文件，运行在 64 位平台，并使用了动态链接文件（共享库）。

与 Windows 不同的是，如果你新建了一个 shiyanlou.txt 文件，Windows 会自动把它识别为文本文件，而 file 命令会识别为一个空文件。这个前面我提到过，在 Linux 中文件的类型不是根据文件后缀来判断的。当你在文件里输入内容后才会显示文件类型。

与搜索相关的命令常用的有 whereis，which，find 和 locate。

whereis 只能搜索二进制文件(-b)，man 帮助文件(-m)和源代码文件(-s)。

使用 locate 命令查找文件也不会遍历硬盘，它通过查询 /var/lib/mlocate/mlocate.db 数据库来检索信息。不过这个数据库也不是实时更新的，系统会使用定时任务每天自动执行 updatedb 命令来更新数据库。所以有时候你刚添加的文件，它可能会找不到，需要手动执行一次 updatedb 命令（在我们的环境中必须先执行一次该命令）注意，它不只是在 /etc 目录下查找，还会自动递归子目录进行查找。

### which 命令

which 本身是 Shell 内建的一个命令，我们通常使用 which 来确定是否安装了某个指定的程序，因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说，我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。

### find 查找命令

find 应该是这几个命令中最强大的了，它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性（如文件的时间戳，文件的权限等）进行搜索

find命令语法：

find [path][option] [action]

find [<起始目录> ...] [<选项表达式>] [<条件匹配表达式>] [<动作表达式>]

<起始目录>：对每个指定的 <起始目录> 递归搜索目录树

省略<起始目录>时表示当前目录

<选项表达式>：控制 find 命令的行为

<条件匹配表达式>：根据匹配条件查找文件

<动作表达式>：指定对查找结果的操作，默认为显示在标准输出（-print）

不带任何参数的 find 命令将在屏幕上递归显示当前目录下的文件列表。

#### 选项

#### 说明

如果遇到符号链接文件，就跟踪链接所指的文件

<table><tr><td>-regexotype TYPE</td><td>指定 -regex 和 -iregex 使用的正则表达式类型，默认为emacs</td></tr><tr><td>-depth/-d</td><td>查找目录自身之前先处理目录中的文件（即深度优先）</td></tr><tr><td>-mount/-xdev</td><td>查找文件时不跨越文件系统</td></tr><tr><td>-maxdepth LEVELS</td><td>设置最大的查找深度</td></tr><tr><td>--help</td><td>显示 find 命令帮助信息</td></tr><tr><td>--version</td><td>显示 find 的版本</td></tr></table>

用户和组  

<table><tr><td>条件</td><td>说明</td></tr><tr><td>-uid N</td><td>用户ID为N的所有文件</td></tr><tr><td>-gid N</td><td>组ID为N的所有文件</td></tr><tr><td>-user USERNAME</td><td>用户名为 USERNAME的所有文件</td></tr><tr><td>-group GROUPNAME</td><td>组名为GROUPNAME的所有文件</td></tr><tr><td>-nouser</td><td>文件属于不在 /etc/passwd 文件中的用户</td></tr><tr><td>-nogroup</td><td>文件属于不在 /etc/group 文件中的组</td></tr></table>

N可以使用 $\mathsf { N } , + \mathsf { N } _ { i }$ ,-N

文件权限  

<table><tr><td>条件</td><td>说明</td></tr><tr><td>-perm MODE</td><td>精确匹配权限模式为 MODE 的文件</td></tr><tr><td>-perm -MODE</td><td>匹配权限模式至少为 MODE 的文件
(用户、组和其他人这三种权限必须都匹配)</td></tr><tr><td>-perm /MODE 或
-perm +MODE</td><td>匹配权限模式至少为 MODE 的文件
(用户、组和其他人这三种权限中有一种匹配即可)</td></tr></table>

2. 与时间相关的命令参数：  

<table><tr><td>参数</td><td>说明</td></tr><tr><td>-atime</td><td>最后访问时间</td></tr><tr><td>-ctime</td><td>最后修改文件内容的时间</td></tr><tr><td>-mtime</td><td>最后修改文件属性的时间</td></tr></table>

#### `-size` 选项

如果要根据文件的大小进行搜索，则使用-size选项

#### `-exec` 和 `-ok` 选项

这两个选项可以对搜索到的文件执行命令，例如重命名、删除、移动等操作。

注意，对于应用与集合的命令，是不适合使用这两个选项的，应该使用管道通信。

-exec 选项会对每个文件单独执行命令。如果你使用 wc -l 计算每个文件的行数，你会得到每个文件的行数结果，而不是这些文件行数的总和。并且，执行 wc -l 会多次调用 wc 命令，每次处理一个文件，这对于计算所有文件的行数总和并不高效。

要使用kill 命令来杀死这个进程。

今天就教你怎么召唤一双眼睛出来监督你：

$\$ 1$ xeyes

你可以使用如下命令将它放到后台运行：

$\$ 1$ nohup xeyes &

### ls 命令

ls 命令

ls [选项] [目录或是文件]

ls －l 按完整格式显示目录及文件信息（权限、所有者、文件大小、修改时间、文件名）

r－读w－写 x－执行

owner/group/others

ls －a

ls －i

ls －al

<table><tr><td>选项</td><td>说明</td></tr><tr><td>-a</td><td>列出目录下的所有文件，包括以.开头的隐含文件。</td></tr><tr><td>-l</td><td>列出文件的详细信息，通常称为“长格式”。</td></tr><tr><td>-d</td><td>输入参数是目录时，只显示该目录本身。</td></tr><tr><td>-A</td><td>显示除“.”和“..”外的所有文件。</td></tr><tr><td>-R</td><td>递归地列出所有子目录下的文件。</td></tr><tr><td>-h</td><td>以人类易读的单位显示文件大小。</td></tr><tr><td>-S</td><td>以文件大小排序输出。</td></tr><tr><td>-t</td><td>以时间排序输出。</td></tr></table>

## 文件打包与压缩

Linux tar（英文全拼：tape archive ）命令用于备份文件。

tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。

tar 名字来自 "tape archive"（磁带归档），最初用于将文件打包到磁带设备中，但现在广泛用于在文件系统中打包和压缩文件。

tar 通常用于将多个文件和目录打包成一个归档文件，称为 "tarball"（通常带有 .tar 扩展名）。

tar 本身不压缩文件，但可以与压缩工具（如 gzip 或 bzip2）结合使用，创建压缩的归档文件（如 .tar.gz 或 .tar.bz2）。

<table><tr><td>命令</td><td>功能</td></tr><tr><td>xz</td><td>使用 LZMA 算法的高性能压缩/解压工具</td></tr><tr><td>gzip</td><td>流行的 GNU gzip 数据压缩/解压程序</td></tr><tr><td>bzip2</td><td>免费的,无专利的高性能数据压缩工具</td></tr><tr><td>zip/unzip</td><td>与 WinZIP 兼容的压缩/解压工具</td></tr><tr><td>rar</td><td>与 WinRAR 兼容的压缩/解压工具</td></tr><tr><td>7za</td><td>使用 LZMA 算法的高性能压缩/解压工具</td></tr><tr><td>tar</td><td>文件打包、归档工具</td></tr></table>

<table><tr><td>文件后缀名</td><td>说明</td></tr><tr><td>*.zip</td><td>zip 程序打包压缩的文件</td></tr><tr><td>*.rar</td><td>rar 程序压缩的文件</td></tr><tr><td>*.7z</td><td>7zip 程序压缩的文件</td></tr><tr><td>*.tar</td><td>tar 程序打包，未压缩的文件</td></tr><tr><td>*.gz</td><td>gzip 程序（GNU zip）压缩的文件</td></tr><tr><td>*.xz</td><td>xz 程序压缩的文件</td></tr><tr><td>*.bz2</td><td>bzip2 程序压缩的文件</td></tr><tr><td>*.tar.gz(.tgz)</td><td>tar 打包，gzip 程序压缩的文件</td></tr><tr><td>*.tar.xz</td><td>tar 打包，xz 程序压缩的文件</td></tr><tr><td>*.tar.bz2(.tbz)</td><td>tar 打包，bzip2 程序压缩的文件</td></tr><tr><td>*.tar.7z</td><td>tar 打包，7z 程序压缩的文件</td></tr></table>

tar [options] -f archive.tar [files...]

-f archive.tar：指定归档文件的名称。  
[files...]：要打包的文件和目录。

基本功能：打包和解包

格式： tar [选项] 文件或者目录

常用选项

-c：创建新的打包文件。  
-t：列出打包文件的内容，查看已经打包了哪些文件。  
-x：从打包文件中释放文件。

-f：指定打包文件名。  
-v：详细列出 tar 处理的文件信息。  
-z：用 gzip 来压缩/解压缩打包文件。  
-j：用 bzip2 来压缩/解压缩打包文件。  
-J：用 xz 来压缩/解压缩打包文件。

命令中，-r 参数表示递归打包包含子目录的全部内容，-q 参数表示为安静模式，即不向屏幕输出信

息，-o，表示输出文件，需在其后紧跟打包输出文件名。后面使用 du 命令查看打包后文件的大小（后面会具体说明该命令）。

. 设置压缩级别为 9 和 1（9 最大，1 最小），重新打包：

这里添加了一个参数用于设置压缩级别 -[1-9]，1 表示最快压缩但体积大，9 表示体积最小但耗时最久。最后那个 -x 是为了排除我们上一次创建的 zip 文件，否则又会被打包进这一次的压缩文件中，

注意：这里只能使用绝对路径，否则不起作用。

使用-e 参数可以创建加密压缩包：

关于zip 命令，因为 Windows 系统与Linux/Unix 在文本文件格式上的一些兼容问题，比如换行符（为不可见字符），在 Windows 为 ${ \mathsf { C R } } { + } \mathsf { L F }$ （Carriage-Return+Line-Feed：回车加换行），而在 Linux/Unix 上为 LF（换行），所以如果在不加处理的情况下，在 Linux上编辑的文本，在 Windows 系统上打开可能看起来是没有换行的。如果你想让你在 Linux创建的 zip 压缩文件在 Windows 上解压后没有任何问题，那么你还需要对命令做一些修改：

$\$ 1$ zip -r -l -o shiyanlou.zip /home/shiyanlou/Desktop

需要加上 -l 参数将 LF 转换为 ${ \mathsf { C R } } { + } \mathsf { L F }$ 来达到以上目的。

使用 -O（英文字母，大写 o）参数指定编码类型：

unzip -O GBK

将 shiyanlou.zip 解压到当前目录：

$\$ 1$ unzip shiyanlou.zip

使用安静模式，将文件解压到指定目录：

$\$ 1$ unzip -q shiyanlou.zip -d ziptest

上述指定目录不存在，将会自动创建。如果你不想解压只想查看压缩包的内容你可以使用-l 参数：

$\$ 1$ unzip -l shiyanlou.zip

在 Linux 上面更常用的是 tar 工具，tar 原本只是一个打包工具，只是同时还是实现了对7z、gzip、xz、bzip2 等工具的支持，这些压缩工具本身只能实现对文件或目录（单独压缩目录中的文件）的压缩，没有实现对文件的打包压缩，所以我们也无需再单独去学习其他几个工具，tar 的解压和压缩都是同一个命令，只需参数不同，使用比较方便。

下面先掌握tar 命令一些基本的使用方式，即不进行压缩只是进行打包（创建归档文件）和解包的操作。

行打包（创建归档文件）和解包的操作。

创建一个 tar 包：

$\$ 1$ cd /home/shiyanlou

$\$ 1$ tar -P -cf shiyanlou.tar /home/shiyanlou/Desktop

上面命令中，-P 保留绝对路径符，-c 表示创建一个 tar 包文件，-f 用于指定创建的文件名，注意文件名必须紧跟在 -f 参数之后，比如不能写成 tar -fc shiyanlou.tar，可以写成 tar -fshiyanlou.tar -c ~。你还可以加上-v 参数以可视的的方式输出打包的文件。

 解包一个文件（ $- \mathsf { X }$ 参数）到指定路径的已存在目录（-C 参数）：

$\$ 1$ mkdir tardir

$\$ 1$ tar -xf shiyanlou.tar -C tardir

只查看不解包文件-t 参数：

$\$ 1$ tar -tf shiyanlou.tar

保留文件属性和跟随链接（符号链接或软链接），有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性（-p 参数）和备份链接指向的源文件而不是链接本身（-h 参数）：

$\$ 1$ tar -cphf etc.tar /etc

 我们只需要在创建 tar 文件的基础上添加 -z 参数，使用 gzip 来压缩文件：

$\$ 1$ tar -czf shiyanlou.tar.gz /home/shiyanlou/Desktop

解压 *.tar.gz 文件：

$\$ 1$ tar -xzf shiyanlou.tar.gz

<table><tr><td>压缩文件格式</td><td>参数</td></tr><tr><td>*.tar.gz</td><td>-z</td></tr><tr><td>*.tar.xz</td><td>-j</td></tr><tr><td>*.tar.bz2</td><td>-j</td></tr></table>

. zip：  
 打包 ：zip something.zip something （目录请加 -r 参数）  
 解包：unzip something.zip   
指定路径：-d 参数  
tar：  
 打包：tar -cf something.tar something   
解包：tar -xf something.tar   
指定路径：-C 参数


压缩后 gzip 会在每个文件的后面添加扩展名 .gz。

压缩后原文件会被自动删除。

在 windows 下可以用 winzip 或 winrar 或 7-zip 解压。

用法：gzip [选项] 文件列表

#### 选项

-d: 解开压缩文件。

-f: 强行压缩文件，不理会文件名称或硬链接是否存在以及该文件是否为符号链接。

-l: 列出压缩文件的相关信息（压缩文件的大小；未压缩文件的大小；压缩比；未压缩文件的名字）。

-n: 压缩文件时，不保存原来的文件名称及时间戳（默认为保存，即-N）。

-r : 递归处理，将指定目录下的所有文件及子目录一同处理。

-t : 测试压缩文件是否正确无误。

-v : 显示指令执行过程。

-<压缩率> : 压缩率是一个介于 $\uparrow \mathord { \sim } 9$ 的数值，默认值为“6”，数值越大压缩率越高。

--best 参数等价于-9；--fast 参数等价于-1。

## 信息显示命令

<table><tr><td>命令</td><td>功能</td></tr><tr><td>hostname</td><td>显示主机名称</td></tr><tr><td>uname</td><td>显示操作系统信息</td></tr><tr><td>dmesg</td><td>显示系统启动信息</td></tr><tr><td>lsmod</td><td>显示系统加载的内核模块</td></tr><tr><td>date</td><td>显示系统时间（cal可以显示系统时间的日历）</td></tr><tr><td>env</td><td>显示系统环境变量</td></tr><tr><td>locale</td><td>显示当前语言环境（cat /etc/sysconfig/i18n）</td></tr><tr><td>cat /etc/redhat-release</td><td>显示操作系统版本（head -1 /etc/issue）</td></tr><tr><td>cat /proc/cpuinfo</td><td>显示CPU信息</td></tr><tr><td>lspci/lsusb</td><td>显示PCI/USB接口信息</td></tr><tr><td>rpm -qa</td><td>显示系统已安装的所有软件包</td></tr></table>

<table><tr><td>命令</td><td>功能</td></tr><tr><td>top</td><td>显示当前系统中耗费资源最多的进程</td></tr><tr><td>free</td><td>显示当前内存的使用情况 (cat /proc/meminfo)</td></tr><tr><td>du -h</td><td>显示指定的文件（目录）已使用的磁盘空间的总量</td></tr><tr><td>df -h</td><td>显示文件系统磁盘空间的使用情况</td></tr><tr><td>uptime</td><td>显示系统运行时间、用户数、负载</td></tr><tr><td>fdisk -l</td><td>查看所有分区</td></tr><tr><td>mount</td><td>查看已经挂装的分区</td></tr><tr><td>swapon -s</td><td>查看所有交换分区</td></tr><tr><td>ps -ef</td><td>查看所有进程</td></tr><tr><td>pstree</td><td>显示进程树</td></tr><tr><td>chkconfig --list</td><td>列出所有系统服务</td></tr><tr><td>who、w</td><td>显示在线登录用户</td></tr><tr><td>whoami</td><td>显示用户自己的身份</td></tr><tr><td>tty</td><td>显示用户当前使用的终端</td></tr><tr><td>id</td><td>显示当前用户的 id 信息</td></tr><tr><td>groups</td><td>显示当前用户属于哪些组</td></tr><tr><td>last</td><td>查看用户登录日志</td></tr><tr><td>crontab -l</td><td>查看当前用户的计划任务</td></tr></table>

<table><tr><td>命令</td><td>功能</td></tr><tr><td>ifconfig</td><td>显示网络接口信息</td></tr><tr><td>route</td><td>显示系统路由表</td></tr><tr><td>iptables -nL</td><td>显示包过滤防火墙的规则设置</td></tr><tr><td>netstat</td><td>显示网络状态信息</td></tr><tr><td>cat /etc/resolv.conf</td><td>显示DNS配置</td></tr><tr><td>cat /etc/hosts</td><td>显示静态主机解析表</td></tr></table>
