Skip to content

文件与目录管理

概述

切换工作目录

cd命令用于切换当前所在的工作目录,是英文change directory的缩写。一般情况下,用户登录后的默认工作目录为其主目录(home目录),例如root用户的主目录为/root。该命令基本格式为cd [PATH]。需要注意的是,cd命令可以接受一些特殊的路径符号作为参数,如下。

特殊路径含义
~当前登录用户的home目录
~user指定用户的home目录
.当前目录
..当前目录的上级目录
-上一个工作目录

​ 在以下示例中,我们将工作目录切换为了/etc

cd示例

显示工作目录

pwd命令用于显示当前的工作目录,是英文print working directory的缩写。该命令的基本格式为pwd [OPTION...],常用选项如下。

选项含义
-L工作目录的逻辑路径(经过符号链接(软链接)解析后的路径,也是环境变量$PWD的值)
-P工作目录的物理路径(实际路径,不经过符号链接(软链接)解析)

tip: pwd命令不添加任何选项时,默认输出的为$PWD变量的值。

​ 在以下示例中,我们将工作目录切换为了/sbin,并分别查看了它的逻辑路径和物理路径。可以发现,/sbin是一个符号链接(软链接),指向/usr/sbin

pwd示例

查看目录

ls命令用于查看目录中的内容,是英文list的缩写。该命令的基本格式为ls [OPTION...] [FILE...],常用选项如下。

选项含义
-a列出全部文件(包含.开头的隐藏文件)
-A列出全部文件,但不包括...这两个目录
-F在每个输出项后追加文件类型的指示符。
当文件为普通文件,无指示符;
*表示具有可执行权限的普通文件;
/表示目录;@表示符号链接(软链接);
`
-l使用长格式列出文件
-h-l选项搭配使用,文件大小信息以人类可读的格式输出(自动转化单位)
-S根据文件大小排序(降序)
-t根据时间排序(降序)
-r排序时反转顺序
-d仅列出目录本身,而不是其内容

tips:

  1. 当参数FILE是文件而不是目录时,仅列出该文件。
  2. 当参数FILE未指定时,默认列出当前工作目录下的内容。
  3. ls命令不添加任何选项时,默认只会列出非隐藏文件,并以文件名进行排序。
  4. 长格式共包含以下七部分信息。

ls长格式

​ 在以下示例中,我们以长格式列出了/root目录下的全部文件内容,并以人类可读的格式显示文件大小信息。

ls示例①

​ 在以下示例中,我们以长格式列出了/目录下的非隐藏文件内容,文件大小信息以人类可读的格式显示,并根据文件大小进行了升序排序。

ls示例②

创建目录

mkdir命令用于创建新的空目录,是英文make directories的缩写。该命令的基本格式为mkdir [OPTION...] DIRECTORY...,常用选项如下。

选项含义
-p递归创建目录(若不指定该选项,父目录不存在时会抛出错误)
-m MODE目录的权限模式

​ 在以下示例中,我们递归地创建了/opt/app/app-01目录。其中,/opt已经存在,而appapp-01目录是由命令创建而来。同时,我们又在/opt/app目录下创建了一个bookkeeping目录,且将其权限模式设置为了770

mkdir示例

删除空目录

​ 与mkdir命令(创建空目录)作用相反,rmdir命令用于删除空目录,是英文remove empty directories。该命令的基本格式为rmdir [OPTION...] DIRECTORY...,常用选项如下。

选项含义
-p递归删除空目录

tip: 当添加-p选项递归删除空目录时,需保证低级目录被删除后,其上级目录是空目录。

​ 在以下示例中,我们删除了/opt/app目录下的app-01bookkeeping这两个空目录。随后又删除了/opt目录下的app目录,因为此时它已经是一个空目录了。

rmdir示例

​ 需要注意的是,rmdir命令的作用非常有限,它只能删除空目录,一旦目录中有内容,则会发生错误。因此,rmdir命令并不常用,在实际过程中,我们更常用rm命令来删除文件(包含目录)。

创建文件

touch命令用于创建新的空文件,基本命令格式为touch [OPTION...] FILE...。在Linux系统中,每个文件(包含目录)都会关联如下四个时间戳数据,这些数据可以通过stat命令查看。

  1. Access: 文件最后一次被访问的时间,一般也称为atime
  2. Modify: 文件最后一次被修改的时间,一般也称为mtime
  3. Change: 文件元数据(如权限、所有者、所属组)最后一次被修改的时间,一般也称为ctime
  4. Birth: 文件被创建的时间。

文件时间戳

​ 而touch命令除了创建文件外,还拥有一个更加重要的功能,即修改文件时间戳(包含目录)。以下为touch命令的常用选项。

tip: touch命令可以修改目录的时间戳数据,但其创建的永远为普通文件,创建目录请使用mkdir命令。

选项含义
-a只更改Access时间
-m只更改Modify时间
-d STRING解析字符串并替代当前时间
-t STAMP解析STAMP并替代当前时间(格式为YYYYMMDD hhmm[.ss]
-r FILE使用FILE文件的时间替代当前时间
-c不创建任何文件

tips:

  1. 当添加-r选项时,目标文件的Access参照时间为引用文件的Access,目标文件的Modify参照时间为引用文件的Modify

  2. ls命令不添加任何选项时,默认行为为:如果文件不存在则创建,并更改AccessModify,若文件存在则只更改AccessModify,更改时间为系统当前时间。

  3. 由于AccessModify也可以视作为文件的元数据。因此,当文件的AccessModify任何一项信息更改时,Change也会随之改变,更改时间永远为系统当前时间,即使添加了-d-t-r选项。

  4. 当添加-d-t-r选项时,其必须在选项组合的最后,例如-actmcdadamcr等。

​ 在以下示例中,我们在/root目录下创建了一个fatgod.md文件,该文件原本未存在。同时,文件的AccessModifyChangeBirth四个时间信息都被初始化为了系统当前时间。

touch示例①

​ 在以下示例中,我们手动地将/root目录下的.oh-my-zsh文件的Modify时间设置为了2024-05-20 13:14:00,并确保.oh-my-zsh文件若不存在时则不被创建。需要注意的是,.oh-my-zsh文件其实是一个目录。

touch示例②

复制文件

cp命令用于复制文件(包含目录),是英文copy的缩写。基本命令格式为cp [OPTION...] SOURCE_FILE DEST_FILE 。

选项含义
-d保持软链接
-p目标文件的权限模式、所有权(所有者和所属组)、时间戳(atimectime)与源文件保持一致
-r递归复制(用于复制目录)
-a等于-dpr
-i交互式复制(若目标文件存在,则会询问是否覆盖)
-n不覆盖现有文件
-l创建源文件的硬链接
-s创建源文件的符号链接(软链接)

tips:

  1. cp命令默认会覆盖现有文件,除非添加-n-i选项。

  2. cp命令需添加-r选项来复制目录,默认不支持。

  3. 当源文件类型为目录时,添加的-l选项将被忽略,并创建全新的目录。

  4. cp命令不添加-d选项时,会存在以下特殊情况:

    • 若源文件SOURCE_FILE为文件的软链接,默认复制的为SOURCE_FILE链接的源文件。若此时存在-l选项,则创建的是SOURCE_FILE链接的源文件的硬链接。
    • 若源文件SOURCE_FILE为目录的软链接,默认复制的为该目录的软链接。若此时存在-l选项,则创建的是全新的目录,并不会创建SOURCE_FILE的硬链接(tip3)。
  5. 当添加-d选项时,若源文件为软链接,则目标文件将尽可能地保持软链接。因此,对于tip4的第一种特殊情况,cp -d命令可以将目标文件复制为与SOURCR_FILE相同指向的软链接,cp -dl命令可以将目标文件复制为SOURCE_FILE的硬链接(此时也可视作为一个软链接)。

​ 在以下示例中,我们在/root目录下对fatgod.md进行了一次备份,拷贝文件名为fatgod.md.bak。在这个过程中,我们确保了/root/fatgod.md.bak文件的权限模式、所有权(所有者和所属组)、时间戳(atimectime)与/root/fatgod.md文件保持一致。如果/root/fatgod.md.bak文件已经存在,则进行交互。

cp示例①


cp命令还有第二种常用的命令格式:cp [OPTION...] SOURCE_FILE... DIRECTORY。当cp命令的最后一个参数为一个已存在的目录时,系统默认会采用这种命令格式进行解析。该命令格式的具体表现为:将指定的一个或多个源文件(包含目录)复制到指定目录中,目标文件名为源文件名⭐。

tip: cp -ar /root /bak这条命令的行为与/bak目录的存在与否有着重要联系,其中:

  1. /bak目录原本存在,则系统会将/root目录作为一个整体复制到/bak中,即会产生/bak/root目录,此时cp将以第二种命令格式解析。如果不想创建/bak/root这一级目录,可以使用cp -ar /root/. /bak命令替代原命令。
  2. /bak目录原本不存在,则系统会将/root目录复制为/bak目录,此时cp将以第一种命令格式解析。

​ 在以下示例中,首先我们将/root目录复制为了一个/bak1目录,需要注意的是,/bak1目录原先是不存在的。接着,我们创建了一个/bak2目录,并将/root目录下的所有内容复制到了/bak2目录中。最后,我们又创建了一个/bak3目录,并将/root目录作为一个整体复制到了/bak3目录中。

cp示例②

移动与重命名文件

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命令还有第二种常用的命令格式:mv [OPTION...] SOURCE_FILE... DIRECTORY。当mv命令的最后一个参数为一个已存在的目录时,系统默认会采用这种命令格式进行解析。该命令格式的具体表现为:将指定的一个或多个源文件(包含目录)移动到指定目录中⭐。

tip: mv /root/origin /root/dest这条命令的行为与/root/dest目录的存在与否有着重要联系,其中:

  1. /root/dest目录原本存在,则系统会将/root/origin目录作为一个整体移动到/root/dest中,即会产生/root/dest/origin目录,此时mv将以第二种命令格式解析。如果不想创建/root/dest/origin这一级目录,可以使用mv /root/origin/* /root/origin/.* /root/dest命令替代原命令。需要注意的是,*符号不能通配隐藏文件(以.开头的文件)。
  2. /root/dest目录原本不存在,则系统会将/root/origin目录重命名为/root/dest,此时cp将以第一种命令格式解析。

​ 在以下示例中,我们模拟创建了一个包含内容的/root/origin目录和一个/root/dest空目录,并将/root/origin目录作为一个整体移动到了/root/dest中。

mv示例②

删除文件

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

rm示例

硬链接和软链接

​ 目前,主流的Linux发行版本都采用ext4类型文件系统,例如Ubuntu、Debian、CentOS等。在ext4文件系统中,分区包含以下两大组成部分。

  1. inode: 索引节点,是一种表数据结构。它用于存储文件的元数据信息,如所有者、所属组、文件大小、时间戳、权限等。
  2. block: 数据块。它用于存储文件实际内容数据。若一个文件的实际数据在一个block中存储不下,则其会占用多个block,每个block只用于存储一个文件的实际内容。

inode与block

tip: inode在文件系统中占用的空间较小,而block占用空间较大。

​ 我们可以通过dumpe2fs -h 文件系统 | grep -E "Inode size|Block size"命令查看默认的inodeblock大小。其中,文件系统参数可以通过df -T | grep "ext4"命令获取。例如,在Ubuntu Server 22.04.3 LTS系统中,inode默认大小为256字节,block默认大小为4096字节(4M)。

inode与block的默认大小

tip: 目录的block中记录着一级文件(包含目录)的文件名与inode号之间的映射关系。因此,文件名不存储在inode中⭐。

​ 每个物理文件都对应了一个inode,而在inode中也存储着一个索引数组,这个数组就记录了文件内容的位置,即block的位置。例如,若文件内容位于硬盘的第4,9,12块,那么这个数组的内容就是[4, 9, 12]。

​ 因此,当我们访问一个文件时,首先会通过文件名找到inode,其次再通过inode找到block,最后通过block数据块获取文件内容。

​ 那以上内容与硬链接和软链接有什么联系呢?其实,硬链接与软链接就是基于此实现的,这有助于我们能够更加清晰地理解它们。当然,在实际的系统实现中,远比这要复杂得多。


​ 硬链接(hard link)就是在其所在目录的block中添加一条新文件名与源文件inode号的映射记录。硬链接可以看作是一个文件别名,它与源文件都关联了相同的inodeblock。基于此,一个文件,只要它的类型不是目录,都可以看作为第一个硬链接⭐。在inode中也存储着一个硬链接计数,只有当这个计数为0时,操作系统才会彻底删除文件,即释放对应的inodeblock

硬链接

tips:

  1. 尽管某些 Linux 系统可能提供了特定的命令选项来允许超级用户尝试创建硬链接到目录,但在它们的底层实现上,硬链接目录往往是被禁止的。因此,一般来说,硬链接不能链接目录
  2. 目录类型文件的inode中的硬链接数量等于其一级子目录数加2,原因在于每个目录都包括两个特殊的引用:.指向目录本身,而..指向父目录。

​ 基于此,硬链接的特点总结如下。

  1. 不论是删除源文件还是硬链接文件,只要还有一个文件存在,这个文件就能够被访问。

  2. 无论是修改源文件还是硬链接文件,文件数据都会发生改变。

  3. 硬链接不会创建新的inodeblock

  4. 由于在不同的文件系统中,inode的计算分配是隔离的。因此,硬链接不能跨分区创建。


​ 软链接,又称为符号链接(symbolic link),其创建时会生成独立的inodeblock。软链接的block中保存了源文件名与源文件inode号的映射。因此,系统便可以根据软链接的block内容准确定位到源文件的block

软链接

tip: 软链接支持链接到目录,它类似于Windows操作系统中的快捷方式。

​ 基于此,软链接的特点总结如下。

  1. 删除软链接文件,源文件不受任何影响。但删除源文件,会导致软链接“不可用”。
  2. 无论是修改源文件还是硬链接文件,文件数据都会发生改变。
  3. 软链接会创建新的inodeblock
  4. 软链接可以跨分区。

ln命令用于创建文件链接(包含目录),是英文link的缩写。该命令的基本格式为ln [OPTION...] SOURCE_FILE LINK_FILE,常用选项如下。

选项含义
-s创建软链接

tip: 当ln命令不添加任何选项时,则默认创建硬链接。

​ 在以下示例中,我们创建了一个/share目录,并在该目录下创建了一个链接到/root/.oh-my-zsh目录的软链接。

ln示例


​ 思考一下,不同的链接文件之间可以相互链接吗?答案是可以的。Linux系统允许我们为软链接文件创建硬链接和软链接,也允许为硬链接文件创建硬链接和软链接。

相互链接

归档和压缩

​ 在Linux系统中,归档(Archiving)和压缩(Compression)是常用的操作,常用于整理、备份和节省存储空间。这两个操作都支持将多个文件(包含目录)组合成一个文件,但它们的具体功能有所不同。

  1. 归档:也被称为打包,归档操作通常不会对文件内容进行压缩,只是将文件集合在一起形成一个归档文件,保留了文件的原始内容和结构。
  2. 压缩:压缩操作会通过特定的压缩算法以减小文件的大小。在Linux系统下,常用的压缩工具有gzip、bzip2、xz等。

tar命令常用于对文件集合进行归档。该命令的基本格式为tar [OPTION...] [FILE...],常用选项如下。

选项含义
-f ARCHIVE指定归档文件
-v列出已处理的文件信息(包括打包与解包)
-c创建一个新的归档(打包)
-A追加tar包到归档
-r追加文件到归档
-x从归档中提取文件(解包)
-t列出归档的内容
-C DIRECTORY指定解包的的目录

tips:

  1. tar命令用于归档的常用选项组合为-cvf(打包)、-xvf(解包)、-Avf(追加包)和-rvf(追加文件)。其中,-v选项用于列出归档所含文件,-f选项用于指定归档文件。
  2. tar命令用于解包或查看归档内容时无需指定文件参数,只需使用-f选项指定待解包的归档文件。
  3. tar命令若不添加-C选项,默认的解包目录为当前工作目录。
  4. 当使用tar命令时,原始的输入文件会被保留(不被删除)。
  5. 归档文件的扩展名通常为.tar

​ 在以下示例中,我们在/root目录下创建了一个空目录tar,并将/root目录下的fatgod.md文件与.oh-my-zsh目录都归档到了/root/tar/entry.tar文件中。

tar示例①

​ 在以下示例中,我们又将/root目录下的fatgod.md.bak1文件追加到了/root/tar/entry.tar归档文件中。

tar示例②

​ 在以下示例中,我们对/root/tar/entry.tar归档进行了解包。其中,解包的输出目录为/root/tar

tar示例③

tip: 归档并不能减小文件集合的总体积,其中包含两方面:

  1. 对于较小的文件集合,归档文件可能会大于原始文件集合的大小,这是因为归档文件除了包含原始数据外,还需要存储一些额外信息,如文件名、文件属性、目录结构等元数据。
  2. 对于较大的文件集合,归档文件可能会小于原始文件集合的大小,这是因为归档可以减少由文件系统的块大小限制和元数据冗余所导致的空间浪费。

​ 在Linux系统中,常用的压缩工具有gzipbzip2zip等,它们都属于无损压缩。这意味着使用这些工具对文件进行压缩后,解压缩后的文件与原始文件是完全一致的,不会有任何数据损失。

gzip命令常用于压缩(或解压缩)文件。该命令的基本格式为gzip [OPTION...] [FILE...],常用选项如下。

选项含义
-l列出压缩文件的压缩细节
-t测试压缩文件的完整性
-${number}指定压缩级别(-1压缩比最低但最快;-9压缩比最高但最慢)
-d解压缩
-c将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件
-r递归压缩(或解压缩)指定目录下的内容
-v输出压缩(或解压缩)信息
-k保留(不删除)输入文件
-f覆盖现有输出文件

tips:

  1. gzip命令的-l选项用于查看压缩文件的压缩细节,而不是用于执行压缩(或解压缩)操作,因此该选项通常被单独使用。
  2. gzip命令不添加任何选项,默认将使用压缩级别为6进行文件压缩,且强制覆盖现有输出文件。此时,压缩前的原始文件会被删除,生成的压缩文件名称为原始文件名称加上.gz后缀⭐,且两者在同一目录下。需要注意的是,添加-k选项可以保留原始文件,即不删除原始文件。
  3. gzip命令添加-d选项能够解压缩以.gz为后缀的文件。生成的解压缩文件名称为原压缩文件名称去掉.gz后缀⭐,且两者在同一目录下。如果此时未添加-k选项,则原先的压缩文件会被删除。
  4. 如果想在压缩(或解压缩)文件过程中不删除原始文件,除了使用-k选项外,也可以使用-c选项。具体做法为:为gzip命令添加-c选项,并将标准输出中的压缩(或解压缩)数据重定向写入指定文件。
  5. gzip命令本身不支持压缩(或解压缩)目录⭐,它只能用于压缩(或解压缩)单个文件。当gzip命令添加了-r选项,其实是对目录下的所有文件逐一进行压缩(或解压缩)。

​ 在以下示例中,我们使用了gzip程序对/root/fatgod.md文件进行了压缩。之后,我们又对压缩文件/root/fatgod.md.gz进行了解压缩。

gzip示例

​ 尽管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命令类似,但存在如下区别:

  1. bzip命令使用的文件格式为.bz2
  2. bzip2命令未提供-l选项。
  3. bzip2命令完全不支持压缩目录,其也未提供-r选项。
  4. bzip2命令默认行为就是压缩文件,无需添加-z选项。

​ 在以下示例中,我们使用了bzip2程序对/root/fatgod.md文件进行了压缩。随后,我们又对压缩文件/root/fatgod.md.bz2进行了解压缩。

bzip2示例

​ 尽管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格式的文件。xzunxz命令的基本格式分别为:xz [OPTION...] [FILE...]unxz [OPTION...] [FILE...],常用选项如下。

选项含义
-l列出压缩文件的压缩细节
-t测试压缩文件的完整性
-${number}指定压缩级别(-1压缩比最低但最快;-9压缩比最高但最慢)
-d解压缩
-z压缩
-c将压缩(或解压缩)后的数据写入标准输出中,并保留输入文件
-v输出压缩(或解压缩)信息
-k保留(不删除)输入文件
-f覆盖现有输出文件

tips:

  1. xzunxz命令提供了-l选项。
  2. xzunxz命令完全不支持压缩目录,也未提供-r选项。

​ 在以下示例中,我们使用了xz程序对/root/fatgod.md文件进行了压缩。之后,我们又使用了unxz程序对压缩文件/root/fatgod.md.xz进行解压缩。

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:

  1. 实际应用中,tar命令用于压缩(或解压缩)文件集合的常用选项组合为-zcvf(打包压缩)、-zxvf(解压缩解包)。
  2. tip1中使用的压缩程序为gzip,若想要更改压缩工具,只需将-z选项替换为-j-J-a即可。
  3. tar命令不支持对已经创建的压缩包进行追加操作⭐。

​ 在以下示例中,我们将/root目录下的fatgod.md文件、fatgod.md.bak1文件、.oh-my-zsh目录和.zshrc文件都打包压缩到了/root/compress/archive.tar.gz文件中。其中,使用的压缩工具为gzip/root/compress目录为此次操作新建。

tar示例④

​ 在以下示例中,我们对压缩包/root/compress/archive.tar.gz进行了解压缩及解包。其中,解包的输出目录为/root/compress/reduce,该目录为此次操作新建。可以看到,原先的文件集合被成功恢复还原了。

tar示例⑤


zip是一种流行的压缩文件格式,在Windows系统中被广泛使用,而在Linux系统中也有对应的工具可以对zip格式文件进行创建和解压缩操作。

tip: 在某些Linux发行版中,zip工具可能并未默认安装。我们可以使用包管理器来安装zip工具,以下是Ubuntu Server 22.04.3 LTS系统中的安装方式。

bash
sudo apt update
sudo apt install zip

zip命令用于压缩文件(包括目录)。该命令的基本格式为zip [OPTION...] ZIP_FILE SOURCE_FILE...,常用选项如下。

选项含义
-T测试zip文件完整性
-d从zip文件中删除指定文件
-r递归压缩(用于压缩目录)
-m压缩后删除输入文件
-v输出更详细的压缩信息
-q不输出任何内容
-${number}指定压缩级别(-1压缩比最低但最快;-9压缩比最高但最慢)
-lLF转换为CR LF
-llCR LF转换为LF
-e加密

tips:

  1. 使用zip命令压缩目录时需添加-r选项,否则压缩时不会包含目录下的内容。当递归压缩时,实际上是往zip文件中添加了目录下的所有文件,文件名是对于目录的相对路径。
  2. 当使用zip命令的-d选项删除目录时,仅会删除zip文件中指定的目录本身,不会递归删除该目录内的内容。此时,我们可以使用\*通配符来删除以该目录名开头的文件,例如zip -d test.zip directory/\*,其中\符号是一个转义符号。
  3. zip命令无需添加任何选项,便可以往zip文件中追加更新内容。对于目录的全量更新,首先可以使用tip2中的方法,删除zip文件中以该目录为前缀的所有文件,然后将该目录中的内容递归地添加到zip文件中。
  4. CR LF是Windows系统中的换行符,可表示为\r\n,它由回车符(CR)和换行符(LF)组合而成。而在Unix和类Unix系统中,只需要使用LF表示换行符,可表示为\n
  5. zip命令添加-e选项时,将对zip文件进行加密,用户需要提供加密密码。在解压缩文件时,必须输入相同的密码才能成功操作。

​ 在以下示例中,我们将/root目录下的fatgod.md文件、fatgod.md.bak1文件、.oh-my-zsh目录和.zshrc文件都打包压缩到了/root/zip/archive.zip文件中。其中,使用的压缩工具为zip/root/zip目录为此次操作新建。

zip示例


unzipzip命令的配套解压缩工具。该命令的基本格式为unzip [OPTION...] ZIP_FILE,常用选项如下。

选项含义
-t测试zip文件完整性
-l列出zip文件中的内容
-o覆盖文件时不提示
-n不覆盖已经存在的文件
-v输出更详细的解压缩信息
-q不输出任何内容
-d DIRECTORY指定解压缩的目录
-x XLIST解压缩时排除XLIST列表中的文件

tips:

  1. zip命令未添加-d选项时,默认的解压缩目录为当前工作目录。
  2. zip命令添加-x选项时,选项及选项值应书写在ZIP_FILE参数之后。

​ 在以下示例中,我们对压缩包/root/zip/archive.zip进行了解压缩。其中,我们排除了fatgod.md.bak1文件与fatgod.md文件,解压缩的输出目录为/root/zip/reduce,该目录为此次操作新建。可以看到,原先的文件集合被成功恢复还原了。

unzip示例

上次更新于: