Linux归档与备份——gzip、gunzip、bzip2、bunzip2、tar、zip、unzip、rsync

维护系统数据安全是计算机系统管理者的基本任务之一,及时创建系统文件的备份文件是维度系统数据安全的一种常用方法。
本节主要介绍以下命令
文件压缩程序

  • gzip:压缩和解压缩文件工具
  • bzip2:块排序文件压缩工具

文件归档程序

  • tar:磁带归档工具
  • zip:打包和压缩文件

文件同步工具

  • rsync:远程文件和目录的同步

0.参考文献

《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光伟 郝记生 译, 人民邮电出版社

如有侵权,可联系博主删除

更多有用的Linux知识详解,可参加博主的Linux学习导航页

1.文件压缩

压缩是为了实现以最小的可利用空间存储最多的数据,其中可利用空间包括内存、存储设备或者网络带宽。数据压缩是一个移除冗余信息的过程。
压缩算法一般分为两大类:无损压缩有损压缩。无损压缩保留原文件的所有数据,也就是压缩文件还原时,还原后的文件与原文件完全一致。有损压缩在压缩时,为了实现更大程度的压缩而删除了某些数据信息,在还原时,与原文件不是完全吻合,但是差距不大。JPEG(图像压缩技术)和MP3(音频压缩技术)就是典型的有损压缩。以下仅讨论无损压缩。

1.1 gzip—文件压缩与解压缩

gzip命令用于压缩一个或更多文件。执行命令后,原文件会被其压缩文件取代,gunzip命令则将压缩文件还原为原文件。例如

$ gzip foo.txt
$ ls -l
总用量 4
-rw-rw-r-- 1 lixj lixj 44 6月  10 19:02 foo.txt.gz
$ gunzip foo.txt.gz
$ ls -l
总用量 21
-rw-rw-r-- 1 lixj lixj 18 6月  10 19:02 foo.txt

可以看出,压缩后的文件大小差不多才是原文件的1/5。我们还可以看出,压缩厚的文件与原文件有着相同的权限和时间戳。
表1 gzip的选项

选项 功能描述
-c 将输出内容写到标准输出端口并保持原文件。也可以用–stdout或者–to–stdout
-d 解压缩,加上该选项后,gzip命令便类似于gunzip。也可以用–decompress或–uncompress
-f 强制压缩,及时原文件的压缩版本已经存在了。也可以用–force替代
-h 显示有用信息,也可用–help代替
-l 列出所有压缩文件的压缩统计,可以用–list代替
-r 如果该命令的操作参数中有一个或是多个目录,那么递归压缩包含在目录中的文件,也可用–recursive代替
-t 检验压缩文件的完整性,可以用–test代替
-v 在压缩时显示详细信息,可以用–verbose代替
-number 设置压缩级别,number是1(速度最快,压缩比最小)~9(速度最慢,压缩比最大)范围内的一个整数。gzip默认的压缩级别是6
$ gzip foo.txt
$ gzip -tv foo.txt.gz
foo.txt.gz:      OK

以上代码使用参数-t、-v检查了压缩文件的完整性。

1.2 bzip2—牺牲速度以换取高质量的数据压缩

bzip2程序与gzip命令功能相仿,但使用不同的压缩算法。该算法具有高质量的数据压缩能力,但却降低了压缩速度。多数情况下与gzip类似,只是以.bz2为后缀。

$ bzip2 foo.txt
$  ls -l
总用量 4
-rw-rw-r-- 1 lixj lixj 3500 6月  15 10:24 foo.txt.bz2
$ bunzip2 foo.txt.bz2
$ ls -l
总用量 21
-rw-rw-r-- 1 lixj lixj 20725 6月  15 10:24 foo.txt

可以看出,bzip2与gzip的用法相似,且前面讨论的几乎所有选项(除了-r选项),bzip2都支持。
bzip2还配有专门的bzip2recover命令,用户恢复损坏的.bz2文件。

2.文件归档

归档是与压缩操作配合使用的一个常用文件管理任务。归档是一个聚集众多文件并将它们组合为一个大文件的过程。它通常作为系统备份的一部分,而且通常也用于将旧数据从某个系统移到某些长期存储设备的情况下。

2.1 tar—磁带归档工具

tar是tape archive的缩写,该命令最初的作用就是磁带备份,但同样用于其它存储设备。tar归档文件可以由许多独立的文件、一个或多个目录层次或者两者的混合而成。语法为

tar mode[options] pathname ...

其中mode是指表2列出的操作模式中一种
表2 tar命令的操作模式

模式 描述
c 创建文件和/或目录列表的归档文件
x 从归档文件中提取文件
t 在归档文件末尾追加指定路径
r 列出归档文件的内容

2.2 zip—打包压缩文件

zip程序既是文件压缩工具又是文件归档工具。Linux用户主要使用zip程序与Windows系统交换文件,而不是将其压缩或者是归档文件。
最基本的调用方式为:

zip options zipfile file

例如创建一个playground的zip归档文件,可以输入以下命令行:

$ zip -r playground.zip playground

显示信息

  adding: playground/ (stored 0%)
  adding: playground/dir-{009,010..99/ (stored 0%)
  adding: playground/dir-{009,0100/ (stored 0%)
  adding: playground/dir-{003,0100/ (stored 0%)
  adding: playground/dir-{007,010..99/ (stored 0%)

这些信息显示的是每个新添归档文件的状态。zip使用两种存储方式向归档文件中添加文件,一种是不对文件进行压缩直接存储,如本例。第二种,对文件进行压缩后存储,紧随存储方法之后显示的数值是压缩比。当前文件夹是空的,所以没有对其内容进行压缩。
利用unzip,可以直接提取zip文件中的内容

$  cd foo
$ unzip ../playground.zip

zip与tar不同的一点是,如果指定的归档文件已经存在,那么zip仅仅只会更新而不是代替。这意味着原来的归档文件会保留下来,只是增加一些新文件,原有匹配文件则会被替换。
通过给unzip指定提取的文件名,我们也可以选择性地从zip归档文件中提取文件。

$  unzip -l ../playground.zip playground/dir-{009,010..99/
Archive:  ../playground.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  06-15-2020 10:56   playground/dir-{009,010..99/
---------                     -------
        0                     1 file

使用选项-l,unzip仅仅会列出归档文件的内容而不会从中提取文件。

$  unzip ../playground.zip playground/dir-{009,010..99/

Archive:  ../playground.zip
   creating: playground/dir-{009,010..99/

3.同步文件和目录

将一个或多个目录与本地系统(通常是某种可移动存储设备)或是远程系统上其它目录保持同步,是维护系统备份文件的常用方法。

3.1 rsync—远程文件、目录的同步

针对类Unix系统,完成这一同步任务最合适的工具当属rsync。该命令通过运行rsync远程更新协议,同步本地与远程系统上的目录。该协议允许rsync命令快速检测到本地和远程系统上两个目录之间的不同,从而以最少数量的复制动作以完成两个目录之间的同步。
rsync调用方式为

rsync options source destination

这里的source和destination是下列选项之一

  • 一个本地文件或目录
  • 一个远程文件或目录,形式为[user@]host:path;
  • 一个远程rsync服务器,由rsync://[user@]host[:port]/path指定

我们在本地实践rsync命令,首先清空foo目录

$ rm -rf foo/*

接着,同步playground目录和它在foo目录中相应的副本:

$ rsync -av playground foo

此命令中,我们运用了-a(用于归档—进行递归归档并保留文件属性)选项和-v(详细输出)选项,在foo目录中生成了playground目录的镜像备份。该命令行除了一系列文件输出之外,最后汇总输出为

sent 555 bytes  received 92 byte`在这里插入代码片`s  1,294.00 bytes/sec
total size is 0  speedup is 0.00

再次运行该命令,输出结果不同

$ sending incremental file list

sent 498 bytes  received 35 bytes  1,066.00 bytes/sec
total size is 0  speedup is 0.00

注意,此时不会列出文件列表,因为rsync目录检测出~/playground和~/foo/playground两个文件夹之间并无不同,因此不需要进行任何复制操作。
如果在playground/目录下更新一个目录,rsync会检测到该变化并且只复制这个刚刚更新的文件。

$ touch playground/dir-\{003\,0100/
$ rsync -av playground foo
sending incremental file list
playground/dir-{003,0100/

sent 511 bytes  received 38 bytes  1,098.00 bytes/sec
total size is 0  speedup is 0.00

3.2 在网络上使用rsync命令

通过网络复制文件是rsync另一个美妙之处。有两种方法:
一种是针对已经安装rsync命令以及诸如ssh等远程shell程序的系统。假定本地网络有另外一个具有足够可利用硬盘的系统,同时希望利用远程系统而非外部设备进行备份操作。假设远程系统已经有一个用于存放备份文件的/backup目录,我们便可以直接运行下面命令

$ sudo rsync -av --delet --rsh=ssh /etc /home /usr/local remote-sys:/backup

此处,一是增加了–rsh=ssh选项,该选项告诉rsync使用ssh命令作为其远程shell命令。第二,在destination路径名前指定了远程主机名,这里是remote-sys
另外一种方法是使用resync服务器同步网络文件,通过配置rsync运行一个守护进程监听进来的同步请求。这种方法通常用于远程系统的镜像系统。

$ mkdir fefora-devel
$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-core/developmengt/i386/os fedora-devel

以上例子使用rsync远程服务的URI是由协议(rsync://)、远程主机名和库的路径组成的

你可能感兴趣的:(ubuntu,linux归档,linux压缩,gzip,tar,unzip)