文件与目录管理
概述
切换工作目录
cd
命令用于切换当前所在的工作目录,是英文change directory的缩写。一般情况下,用户登录后的默认工作目录为其主目录(home目录),例如root
用户的主目录为/root
。该命令基本格式为cd [PATH]
。需要注意的是,cd
命令可以接受一些特殊的路径符号作为参数,如下。
特殊路径 | 含义 |
---|---|
~ | 当前登录用户的home目录 |
~user | 指定用户的home目录 |
. | 当前目录 |
.. | 当前目录的上级目录 |
- | 上一个工作目录 |
在以下示例中,我们将工作目录切换为了/etc
。
显示工作目录
pwd
命令用于显示当前的工作目录,是英文print working directory的缩写。该命令的基本格式为pwd [OPTION...]
,常用选项如下。
选项 | 含义 |
---|---|
-L | 工作目录的逻辑路径(经过符号链接(软链接)解析后的路径,也是环境变量$PWD 的值) |
-P | 工作目录的物理路径(实际路径,不经过符号链接(软链接)解析) |
tip:
pwd
命令不添加任何选项时,默认输出的为$PWD
变量的值。
在以下示例中,我们将工作目录切换为了/sbin
,并分别查看了它的逻辑路径和物理路径。可以发现,/sbin
是一个符号链接(软链接),指向/usr/sbin
。
查看目录
ls
命令用于查看目录中的内容,是英文list的缩写。该命令的基本格式为ls [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-a | 列出全部文件(包含. 开头的隐藏文件) |
-A | 列出全部文件,但不包括. 与.. 这两个目录 |
-F | 在每个输出项后追加文件类型的指示符。 当文件为普通文件,无指示符; * 表示具有可执行权限的普通文件;/ 表示目录;@ 表示符号链接(软链接);` |
-l | 使用长格式列出文件 |
-h | 和-l 选项搭配使用,文件大小信息以人类可读的格式输出(自动转化单位) |
-S | 根据文件大小排序(降序) |
-t | 根据时间排序(降序) |
-r | 排序时反转顺序 |
-d | 仅列出目录本身,而不是其内容 |
tips:
- 当参数
FILE
是文件而不是目录时,仅列出该文件。- 当参数
FILE
未指定时,默认列出当前工作目录下的内容。- 当
ls
命令不添加任何选项时,默认只会列出非隐藏文件,并以文件名进行排序。- 长格式共包含以下七部分信息。
在以下示例中,我们以长格式列出了/root
目录下的全部文件内容,并以人类可读的格式显示文件大小信息。
在以下示例中,我们以长格式列出了/
目录下的非隐藏文件内容,文件大小信息以人类可读的格式显示,并根据文件大小进行了升序排序。
创建目录
mkdir
命令用于创建新的空目录,是英文make directories的缩写。该命令的基本格式为mkdir [OPTION...] DIRECTORY...
,常用选项如下。
选项 | 含义 |
---|---|
-p | 递归创建目录(若不指定该选项,父目录不存在时会抛出错误) |
-m MODE | 目录的权限模式 |
在以下示例中,我们递归地创建了/opt/app/app-01
目录。其中,/opt
已经存在,而app
和app-01
目录是由命令创建而来。同时,我们又在/opt/app
目录下创建了一个bookkeeping
目录,且将其权限模式设置为了770
。
删除空目录
与mkdir
命令(创建空目录)作用相反,rmdir
命令用于删除空目录,是英文remove empty directories。该命令的基本格式为rmdir [OPTION...] DIRECTORY...
,常用选项如下。
选项 | 含义 |
---|---|
-p | 递归删除空目录 |
tip: 当添加
-p
选项递归删除空目录时,需保证低级目录被删除后,其上级目录是空目录。
在以下示例中,我们删除了/opt/app
目录下的app-01
和bookkeeping
这两个空目录。随后又删除了/opt
目录下的app
目录,因为此时它已经是一个空目录了。
需要注意的是,rmdir
命令的作用非常有限,它只能删除空目录,一旦目录中有内容,则会发生错误。因此,rmdir
命令并不常用,在实际过程中,我们更常用rm
命令来删除文件(包含目录)。
创建文件
touch
命令用于创建新的空文件,基本命令格式为touch [OPTION...] FILE...
。在Linux系统中,每个文件(包含目录)都会关联如下四个时间戳数据,这些数据可以通过stat
命令查看。
Access
: 文件最后一次被访问的时间,一般也称为atime
。Modify
: 文件最后一次被修改的时间,一般也称为mtime
。Change
: 文件元数据(如权限、所有者、所属组)最后一次被修改的时间,一般也称为ctime
。Birth
: 文件被创建的时间。
而touch
命令除了创建文件外,还拥有一个更加重要的功能,即修改文件时间戳(包含目录)。以下为touch
命令的常用选项。
tip:
touch
命令可以修改目录的时间戳数据,但其创建的永远为普通文件,创建目录请使用mkdir
命令。
选项 | 含义 |
---|---|
-a | 只更改Access 时间 |
-m | 只更改Modify 时间 |
-d STRING | 解析字符串并替代当前时间 |
-t STAMP | 解析STAMP并替代当前时间(格式为YYYYMMDD hhmm[.ss] ) |
-r FILE | 使用FILE文件的时间替代当前时间 |
-c | 不创建任何文件 |
tips:
当添加
-r
选项时,目标文件的Access
参照时间为引用文件的Access
,目标文件的Modify
参照时间为引用文件的Modify
。当
ls
命令不添加任何选项时,默认行为为:如果文件不存在则创建,并更改Access
和Modify
,若文件存在则只更改Access
和Modify
,更改时间为系统当前时间。由于
Access
和Modify
也可以视作为文件的元数据。因此,当文件的Access
或Modify
任何一项信息更改时,Change
也会随之改变,更改时间永远为系统当前时间,即使添加了-d
、-t
或-r
选项。当添加
-d
、-t
或-r
选项时,其必须在选项组合的最后,例如-act
、mcd
、ad
、amcr
等。
在以下示例中,我们在/root
目录下创建了一个fatgod.md
文件,该文件原本未存在。同时,文件的Access
、Modify
、Change
和Birth
四个时间信息都被初始化为了系统当前时间。
在以下示例中,我们手动地将/root
目录下的.oh-my-zsh
文件的Modify
时间设置为了2024-05-20 13:14:00
,并确保.oh-my-zsh
文件若不存在时则不被创建。需要注意的是,.oh-my-zsh
文件其实是一个目录。
复制文件
cp
命令用于复制文件(包含目录),是英文copy的缩写。基本命令格式为cp [OPTION...] SOURCE_FILE DEST_FILE 。
选项 | 含义 |
---|---|
-d | 保持软链接 |
-p | 目标文件的权限模式、所有权(所有者和所属组)、时间戳(atime 与ctime )与源文件保持一致 |
-r | 递归复制(用于复制目录) |
-a | 等于-dpr |
-i | 交互式复制(若目标文件存在,则会询问是否覆盖) |
-n | 不覆盖现有文件 |
-l | 创建源文件的硬链接 |
-s | 创建源文件的符号链接(软链接) |
tips:
cp
命令默认会覆盖现有文件,除非添加-n
或-i
选项。
cp
命令需添加-r
选项来复制目录,默认不支持。当源文件类型为目录时,添加的
-l
选项将被忽略,并创建全新的目录。当
cp
命令不添加-d
选项时,会存在以下特殊情况:
- 若源文件
SOURCE_FILE
为文件的软链接,默认复制的为SOURCE_FILE
链接的源文件。若此时存在-l
选项,则创建的是SOURCE_FILE
链接的源文件的硬链接。- 若源文件
SOURCE_FILE
为目录的软链接,默认复制的为该目录的软链接。若此时存在-l
选项,则创建的是全新的目录,并不会创建SOURCE_FILE
的硬链接(tip3)。当添加
-d
选项时,若源文件为软链接,则目标文件将尽可能地保持软链接。因此,对于tip4的第一种特殊情况,cp -d
命令可以将目标文件复制为与SOURCR_FILE
相同指向的软链接,cp -dl
命令可以将目标文件复制为SOURCE_FILE
的硬链接(此时也可视作为一个软链接)。
在以下示例中,我们在/root
目录下对fatgod.md
进行了一次备份,拷贝文件名为fatgod.md.bak
。在这个过程中,我们确保了/root/fatgod.md.bak
文件的权限模式、所有权(所有者和所属组)、时间戳(atime
与ctime
)与/root/fatgod.md
文件保持一致。如果/root/fatgod.md.bak
文件已经存在,则进行交互。
cp
命令还有第二种常用的命令格式:cp [OPTION...] SOURCE_FILE... DIRECTORY
。当cp
命令的最后一个参数为一个已存在的目录时,系统默认会采用这种命令格式进行解析。该命令格式的具体表现为:将指定的一个或多个源文件(包含目录)复制到指定目录中,目标文件名为源文件名⭐。
tip:
cp -ar /root /bak
这条命令的行为与/bak
目录的存在与否有着重要联系,其中:
- 若
/bak
目录原本存在,则系统会将/root
目录作为一个整体复制到/bak
中,即会产生/bak/root
目录,此时cp
将以第二种命令格式解析。如果不想创建/bak/root
这一级目录,可以使用cp -ar /root/. /bak
命令替代原命令。- 若
/bak
目录原本不存在,则系统会将/root
目录复制为/bak
目录,此时cp
将以第一种命令格式解析。
在以下示例中,首先我们将/root
目录复制为了一个/bak1
目录,需要注意的是,/bak1
目录原先是不存在的。接着,我们创建了一个/bak2
目录,并将/root
目录下的所有内容复制到了/bak2
目录中。最后,我们又创建了一个/bak3
目录,并将/root
目录作为一个整体复制到了/bak3
目录中。
移动与重命名文件
mv
命令用于移动或重命名文件(包含目录),是英文move的缩写。该命令的基本格式为mv [OPTION...] SOURCE_FILE DEST_FILE
,常用选项如下。
选项 | 含义 |
---|---|
-i | 交互式移动(若目标文件存在,则会询问是否覆盖) |
-n | 不覆盖现有文件 |
tip:
cp
命令默认会覆盖现有文件,除非添加-n
或-i
选项。
在以下示例中,我们将/root
目录下的fatgod.md.bak
文件重命名为了fatgod.md.bak1
。如果/root/fatgod.md.bak1
文件已经存在,则进行交互。
mv
命令还有第二种常用的命令格式:mv [OPTION...] SOURCE_FILE... DIRECTORY
。当mv
命令的最后一个参数为一个已存在的目录时,系统默认会采用这种命令格式进行解析。该命令格式的具体表现为:将指定的一个或多个源文件(包含目录)移动到指定目录中⭐。
tip:
mv /root/origin /root/dest
这条命令的行为与/root/dest
目录的存在与否有着重要联系,其中:
- 若
/root/dest
目录原本存在,则系统会将/root/origin
目录作为一个整体移动到/root/dest
中,即会产生/root/dest/origin
目录,此时mv
将以第二种命令格式解析。如果不想创建/root/dest/origin
这一级目录,可以使用mv /root/origin/* /root/origin/.* /root/dest
命令替代原命令。需要注意的是,*
符号不能通配隐藏文件(以.
开头的文件)。- 若
/root/dest
目录原本不存在,则系统会将/root/origin
目录重命名为/root/dest
,此时cp
将以第一种命令格式解析。
在以下示例中,我们模拟创建了一个包含内容的/root/origin
目录和一个/root/dest
空目录,并将/root/origin
目录作为一个整体移动到了/root/dest
中。
删除文件
rm
命令用于删除文件(包含目录),是英文remove的缩写。该命令的基本格式为rm [OPTION...] FILE...
,常用选项如下。
tip:
rm
是一个具有破坏性的命令,它会永久性地删除指定文件。因此,该命令需慎用。
选项 | 含义 |
---|---|
-i | 交互式删除(系统会询问提示) |
-f | 强制式删除(系统没有任何询问提示) |
-d | 删除空目录(等同于rmdir ) |
-r | 递归删除(删除目录时不需要添加-d 选项) |
tip: 当
rm
命令不添加任何选项时,默认不支持删除目录。至于是交互式还是强制式,取决于发行版本,例如在Ubuntu Server 22.04.3 LTS
中,默认为强制式删除。
在以下示例中,我们首先备份了/root/.oh-my-zsh
目录,其次删除了该目录,最后将备份内容重新恢复为.oh-my-zsh
。
硬链接和软链接
目前,主流的Linux发行版本都采用ext4类型文件系统,例如Ubuntu、Debian、CentOS等。在ext4文件系统中,分区包含以下两大组成部分。
inode
: 索引节点,是一种表数据结构。它用于存储文件的元数据信息,如所有者、所属组、文件大小、时间戳、权限等。block
: 数据块。它用于存储文件实际内容数据。若一个文件的实际数据在一个block
中存储不下,则其会占用多个block
,每个block
只用于存储一个文件的实际内容。
tip:
inode
在文件系统中占用的空间较小,而block
占用空间较大。
我们可以通过dumpe2fs -h 文件系统 | grep -E "Inode size|Block size"
命令查看默认的inode
和block
大小。其中,文件系统参数可以通过df -T | grep "ext4"
命令获取。例如,在Ubuntu Server 22.04.3 LTS
系统中,inode
默认大小为256字节,block
默认大小为4096字节(4M)。
tip: 目录的
block
中记录着一级文件(包含目录)的文件名与inode
号之间的映射关系。因此,文件名不存储在inode
中⭐。
每个物理文件都对应了一个inode
,而在inode
中也存储着一个索引数组,这个数组就记录了文件内容的位置,即block
的位置。例如,若文件内容位于硬盘的第4,9,12块,那么这个数组的内容就是[4, 9, 12]。
因此,当我们访问一个文件时,首先会通过文件名找到inode
,其次再通过inode
找到block
,最后通过block
数据块获取文件内容。
那以上内容与硬链接和软链接有什么联系呢?其实,硬链接与软链接就是基于此实现的,这有助于我们能够更加清晰地理解它们。当然,在实际的系统实现中,远比这要复杂得多。
硬链接(hard link)就是在其所在目录的block
中添加一条新文件名与源文件inode
号的映射记录。硬链接可以看作是一个文件别名,它与源文件都关联了相同的inode
和block
。基于此,一个文件,只要它的类型不是目录,都可以看作为第一个硬链接⭐。在inode
中也存储着一个硬链接计数,只有当这个计数为0时,操作系统才会彻底删除文件,即释放对应的inode
和block
。
tips:
- 尽管某些 Linux 系统可能提供了特定的命令选项来允许超级用户尝试创建硬链接到目录,但在它们的底层实现上,硬链接目录往往是被禁止的。因此,一般来说,硬链接不能链接目录。
- 目录类型文件的
inode
中的硬链接数量等于其一级子目录数加2,原因在于每个目录都包括两个特殊的引用:.
指向目录本身,而..
指向父目录。
基于此,硬链接的特点总结如下。
不论是删除源文件还是硬链接文件,只要还有一个文件存在,这个文件就能够被访问。
无论是修改源文件还是硬链接文件,文件数据都会发生改变。
硬链接不会创建新的
inode
和block
。由于在不同的文件系统中,
inode
的计算分配是隔离的。因此,硬链接不能跨分区创建。
软链接,又称为符号链接(symbolic link),其创建时会生成独立的inode
和block
。软链接的block
中保存了源文件名与源文件inode
号的映射。因此,系统便可以根据软链接的block
内容准确定位到源文件的block
。
tip: 软链接支持链接到目录,它类似于Windows操作系统中的快捷方式。
基于此,软链接的特点总结如下。
- 删除软链接文件,源文件不受任何影响。但删除源文件,会导致软链接“不可用”。
- 无论是修改源文件还是硬链接文件,文件数据都会发生改变。
- 软链接会创建新的
inode
和block
。 - 软链接可以跨分区。
ln
命令用于创建文件链接(包含目录),是英文link的缩写。该命令的基本格式为ln [OPTION...] SOURCE_FILE LINK_FILE
,常用选项如下。
选项 | 含义 |
---|---|
-s | 创建软链接 |
tip: 当
ln
命令不添加任何选项时,则默认创建硬链接。
在以下示例中,我们创建了一个/share
目录,并在该目录下创建了一个链接到/root/.oh-my-zsh
目录的软链接。
思考一下,不同的链接文件之间可以相互链接吗?答案是可以的。Linux系统允许我们为软链接文件创建硬链接和软链接,也允许为硬链接文件创建硬链接和软链接。
归档和压缩
在Linux系统中,归档(Archiving)和压缩(Compression)是常用的操作,常用于整理、备份和节省存储空间。这两个操作都支持将多个文件(包含目录)组合成一个文件,但它们的具体功能有所不同。
- 归档:也被称为打包,归档操作通常不会对文件内容进行压缩,只是将文件集合在一起形成一个归档文件,保留了文件的原始内容和结构。
- 压缩:压缩操作会通过特定的压缩算法以减小文件的大小。在Linux系统下,常用的压缩工具有gzip、bzip2、xz等。
tar
命令常用于对文件集合进行归档。该命令的基本格式为tar [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-f ARCHIVE | 指定归档文件 |
-v | 列出已处理的文件信息(包括打包与解包) |
-c | 创建一个新的归档(打包) |
-A | 追加tar包到归档 |
-r | 追加文件到归档 |
-x | 从归档中提取文件(解包) |
-t | 列出归档的内容 |
-C DIRECTORY | 指定解包的的目录 |
tips:
tar
命令用于归档的常用选项组合为-cvf
(打包)、-xvf
(解包)、-Avf
(追加包)和-rvf
(追加文件)。其中,-v
选项用于列出归档所含文件,-f
选项用于指定归档文件。tar
命令用于解包或查看归档内容时无需指定文件参数,只需使用-f
选项指定待解包的归档文件。tar
命令若不添加-C
选项,默认的解包目录为当前工作目录。- 当使用
tar
命令时,原始的输入文件会被保留(不被删除)。- 归档文件的扩展名通常为
.tar
。
在以下示例中,我们在/root
目录下创建了一个空目录tar
,并将/root
目录下的fatgod.md
文件与.oh-my-zsh
目录都归档到了/root/tar/entry.tar
文件中。
在以下示例中,我们又将/root
目录下的fatgod.md.bak1
文件追加到了/root/tar/entry.tar
归档文件中。
在以下示例中,我们对/root/tar/entry.tar
归档进行了解包。其中,解包的输出目录为/root/tar
。
tip: 归档并不能减小文件集合的总体积,其中包含两方面:
- 对于较小的文件集合,归档文件可能会大于原始文件集合的大小,这是因为归档文件除了包含原始数据外,还需要存储一些额外信息,如文件名、文件属性、目录结构等元数据。
- 对于较大的文件集合,归档文件可能会小于原始文件集合的大小,这是因为归档可以减少由文件系统的块大小限制和元数据冗余所导致的空间浪费。
在Linux系统中,常用的压缩工具有gzip
、bzip2
和zip
等,它们都属于无损压缩。这意味着使用这些工具对文件进行压缩后,解压缩后的文件与原始文件是完全一致的,不会有任何数据损失。
gzip
命令常用于压缩(或解压缩)文件。该命令的基本格式为gzip [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-l | 列出压缩文件的压缩细节 |
-t | 测试压缩文件的完整性 |
-${number} | 指定压缩级别(-1 压缩比最低但最快;-9 压缩比最高但最慢) |
-d | 解压缩 |
-c | 将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件 |
-r | 递归压缩(或解压缩)指定目录下的内容 |
-v | 输出压缩(或解压缩)信息 |
-k | 保留(不删除)输入文件 |
-f | 覆盖现有输出文件 |
tips:
gzip
命令的-l
选项用于查看压缩文件的压缩细节,而不是用于执行压缩(或解压缩)操作,因此该选项通常被单独使用。- 若
gzip
命令不添加任何选项,默认将使用压缩级别为6
进行文件压缩,且强制覆盖现有输出文件。此时,压缩前的原始文件会被删除,生成的压缩文件名称为原始文件名称加上.gz
后缀⭐,且两者在同一目录下。需要注意的是,添加-k
选项可以保留原始文件,即不删除原始文件。gzip
命令添加-d
选项能够解压缩以.gz
为后缀的文件。生成的解压缩文件名称为原压缩文件名称去掉.gz
后缀⭐,且两者在同一目录下。如果此时未添加-k
选项,则原先的压缩文件会被删除。- 如果想在压缩(或解压缩)文件过程中不删除原始文件,除了使用
-k
选项外,也可以使用-c
选项。具体做法为:为gzip
命令添加-c
选项,并将标准输出中的压缩(或解压缩)数据重定向写入指定文件。gzip
命令本身不支持压缩(或解压缩)目录⭐,它只能用于压缩(或解压缩)单个文件。当gzip
命令添加了-r
选项,其实是对目录下的所有文件逐一进行压缩(或解压缩)。
在以下示例中,我们使用了gzip
程序对/root/fatgod.md
文件进行了压缩。之后,我们又对压缩文件/root/fatgod.md.gz
进行了解压缩。
尽管gzip
可以解压缩以.gz
为后缀的文件,但在Linux中还存在一个专有gunzip
命令用于解压缩.gz
格式文件,其功能与gzip -d
命令一致。该命令的基本格式为gunzip [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-l | 列出压缩文件的压缩细节 |
-t | 测试压缩文件的完整性 |
-c | 将解压缩后的数据写入标准输出中,并保留输入文件 |
-r | 递归解压缩指定目录下的内容 |
-v | 输出解压缩信息 |
-k | 保留(不删除)输入文件 |
-f | 覆盖现有输出文件 |
tip: 在实际应用中,我们建议:
gunzip
命令用于解压缩文件,而gzip
命令仅用于压缩文件⭐。
与gzip
命令类似,bzip2
命令也常用于压缩(或解压缩)文件。这两个命令使用了不同的压缩算法,理论来说,bzip2
命令使用算法更先进、压缩比更好,而gzip
命令使用的算法速度更快。bzip2
命令的基本格式为bzip2 [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-t | 测试压缩文件的完整性 |
-${number} | 指定压缩级别(-1 压缩比最低但最快;-9 压缩比最高但最慢) |
-z | 压缩 |
-d | 解压缩 |
-c | 将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件 |
-v | 输出压缩(或解压缩)信息 |
-k | 保留(不删除)输入文件 |
-f | 覆盖现有输出文件 |
tip:
bzip2
命令提供的常用选项与gzip
命令类似,但存在如下区别:
bzip
命令使用的文件格式为.bz2
。bzip2
命令未提供-l
选项。bzip2
命令完全不支持压缩目录,其也未提供-r
选项。bzip2
命令默认行为就是压缩文件,无需添加-z
选项。
在以下示例中,我们使用了bzip2
程序对/root/fatgod.md
文件进行了压缩。随后,我们又对压缩文件/root/fatgod.md.bz2
进行了解压缩。
尽管bzip2
可以解压缩以.bz2
为后缀的文件,但在Linux中还存在一个专有bunzip2
命令用于解压缩.bz2
格式文件,其功能与bzip2 -d
命令一致。该命令的基本格式为bunzip2 [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-t | 测试压缩文件的完整性 |
-${number} | 指定压缩级别(-1 压缩比最低但最快;-9 压缩比最高但最慢) |
-z | 压缩 |
-d | 解压缩 |
-c | 将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件 |
-v | 输出压缩(或解压缩)信息 |
-k | 保留(不删除)输入文件 |
-f | 覆盖现有输出文件 |
tip: 其实
bunzip2
命令提供的选项与bzip2
是一致的,因为它们两个都能用于压缩与解压缩.bz2
格式的文件。bzip2
命令添加-d
选项可以解压缩文件,而bunzip2
命令添加-z
选项也可以压缩文件。但在实际应用中,我们建议:bunzip2
命令仅用于解压缩文件,而bzip2
命令仅用于压缩文件⭐。
在Linux系统中,xz
命令与unxz
命令也是一对常用的压缩工具组合。它们都提供了一致的选项,且都可以用于压缩和解压缩.xz
格式的文件。xz
与unxz
命令的基本格式分别为:xz [OPTION...] [FILE...]
、unxz [OPTION...] [FILE...]
,常用选项如下。
选项 | 含义 |
---|---|
-l | 列出压缩文件的压缩细节 |
-t | 测试压缩文件的完整性 |
-${number} | 指定压缩级别(-1 压缩比最低但最快;-9 压缩比最高但最慢) |
-d | 解压缩 |
-z | 压缩 |
-c | 将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件 |
-v | 输出压缩(或解压缩)信息 |
-k | 保留(不删除)输入文件 |
-f | 覆盖现有输出文件 |
tips:
xz
与unxz
命令提供了-l
选项。xz
与unxz
命令完全不支持压缩目录,也未提供-r
选项。
在以下示例中,我们使用了xz
程序对/root/fatgod.md
文件进行了压缩。之后,我们又使用了unxz
程序对压缩文件/root/fatgod.md.xz
进行解压缩。
tip: 在实际应用中,我们建议:
unxz
命令仅用于解压缩文件,而xz
命令仅用于压缩文件⭐。
那思考一下,在Linux系统中如何压缩文件集合(包含目录)呢?其实,我们可以先将文件集合归档成一个文件,再对这个文件进行压缩。
那再思考一下,这种文件集合(包含目录)的压缩包如何还原呢?其实,我们可以先对压缩包进行解压缩,再对解压缩后的归档文件进行解包。
在以下示例中,我们将/root
目录下的fatgod.md
文件、fatgod.md.bak1
文件、.oh-my-zsh
目录和.zshrc
文件都归档到了/root/tar/container.tar
文件中。随后,我们又使用了gzip
程序对归档文件/root/tar/container.tar
进行压缩。
在以下示例中,我们对压缩包/root/tar/container.tar.gz
进行了解压缩。随后,我们又对解压缩输出的/root/tar/container.tar
文件进行了解包。其中解包的输出目录为/root/tar/reduce
,该目录为此次操作新建。可以看到,fatgod.md
文件、fatgod.md.bak1
文件、.oh-my-zsh
目录和.zshrc
文件都被成功恢复还原了。
从上述得出,先打包后压缩可以为文件集合制作压缩包,而先解压缩后解包可以还原恢复文件集合。那这两种方法会不会太繁琐了呢?其实,为了简化打包压缩和解压缩解包过程,tar
命令提供了压缩相关的选项,以此来结合打包(或解包)和压缩(或解压缩)。
选项 | 含义 |
---|---|
-z | 使用gzip 压缩(或解压缩) |
-j | 使用bzip2 压缩(或解压缩) |
-J | 使用xz 压缩(或解压缩) |
-a | 使用归档后缀来决定压缩程序 |
tips:
- 实际应用中,
tar
命令用于压缩(或解压缩)文件集合的常用选项组合为-zcvf
(打包压缩)、-zxvf
(解压缩解包)。- tip1中使用的压缩程序为
gzip
,若想要更改压缩工具,只需将-z
选项替换为-j
、-J
或-a
即可。tar
命令不支持对已经创建的压缩包进行追加操作⭐。
在以下示例中,我们将/root
目录下的fatgod.md
文件、fatgod.md.bak1
文件、.oh-my-zsh
目录和.zshrc
文件都打包压缩到了/root/compress/archive.tar.gz
文件中。其中,使用的压缩工具为gzip
,/root/compress
目录为此次操作新建。
在以下示例中,我们对压缩包/root/compress/archive.tar.gz
进行了解压缩及解包。其中,解包的输出目录为/root/compress/reduce
,该目录为此次操作新建。可以看到,原先的文件集合被成功恢复还原了。
zip
是一种流行的压缩文件格式,在Windows系统中被广泛使用,而在Linux系统中也有对应的工具可以对zip
格式文件进行创建和解压缩操作。
tip: 在某些Linux发行版中,
zip
工具可能并未默认安装。我们可以使用包管理器来安装zip
工具,以下是Ubuntu Server 22.04.3 LTS
系统中的安装方式。bashsudo apt update sudo apt install zip
zip
命令用于压缩文件(包括目录)。该命令的基本格式为zip [OPTION...] ZIP_FILE SOURCE_FILE...
,常用选项如下。
选项 | 含义 |
---|---|
-T | 测试zip文件完整性 |
-d | 从zip文件中删除指定文件 |
-r | 递归压缩(用于压缩目录) |
-m | 压缩后删除输入文件 |
-v | 输出更详细的压缩信息 |
-q | 不输出任何内容 |
-${number} | 指定压缩级别(-1 压缩比最低但最快;-9 压缩比最高但最慢) |
-l | 将LF 转换为CR LF |
-ll | 将CR LF 转换为LF |
-e | 加密 |
tips:
- 使用
zip
命令压缩目录时需添加-r
选项,否则压缩时不会包含目录下的内容。当递归压缩时,实际上是往zip文件中添加了目录下的所有文件,文件名是对于目录的相对路径。- 当使用
zip
命令的-d
选项删除目录时,仅会删除zip文件中指定的目录本身,不会递归删除该目录内的内容。此时,我们可以使用\*
通配符来删除以该目录名开头的文件,例如zip -d test.zip directory/\*
,其中\
符号是一个转义符号。zip
命令无需添加任何选项,便可以往zip文件中追加或更新内容。对于目录的全量更新,首先可以使用tip2中的方法,删除zip文件中以该目录为前缀的所有文件,然后将该目录中的内容递归地添加到zip文件中。CR LF
是Windows系统中的换行符,可表示为\r\n
,它由回车符(CR
)和换行符(LF
)组合而成。而在Unix和类Unix系统中,只需要使用LF
表示换行符,可表示为\n
。- 当
zip
命令添加-e
选项时,将对zip文件进行加密,用户需要提供加密密码。在解压缩文件时,必须输入相同的密码才能成功操作。
在以下示例中,我们将/root
目录下的fatgod.md
文件、fatgod.md.bak1
文件、.oh-my-zsh
目录和.zshrc
文件都打包压缩到了/root/zip/archive.zip
文件中。其中,使用的压缩工具为zip
,/root/zip
目录为此次操作新建。
unzip
是zip
命令的配套解压缩工具。该命令的基本格式为unzip [OPTION...] ZIP_FILE
,常用选项如下。
选项 | 含义 |
---|---|
-t | 测试zip文件完整性 |
-l | 列出zip文件中的内容 |
-o | 覆盖文件时不提示 |
-n | 不覆盖已经存在的文件 |
-v | 输出更详细的解压缩信息 |
-q | 不输出任何内容 |
-d DIRECTORY | 指定解压缩的目录 |
-x XLIST | 解压缩时排除XLIST 列表中的文件 |
tips:
- 当
zip
命令未添加-d
选项时,默认的解压缩目录为当前工作目录。- 当
zip
命令添加-x
选项时,选项及选项值应书写在ZIP_FILE
参数之后。
在以下示例中,我们对压缩包/root/zip/archive.zip
进行了解压缩。其中,我们排除了fatgod.md.bak1
文件与fatgod.md
文件,解压缩的输出目录为/root/zip/reduce
,该目录为此次操作新建。可以看到,原先的文件集合被成功恢复还原了。