天天看点

Linux压缩与归档

1.目标

  • 文件压缩程序
    • gzip:压缩与解压缩文件
    • bzip2:快排序文件压缩器
  • 归档程序
    • tar:磁带归档
    • zip:压缩文件
  • 文件同步程序
    • rsync: 远程文件和目录同步

2.gzip

  1. gzip程序可以压缩单个或多个文件
  2. 程序执行后,原文件将被替换为file.gz文件
  3. 压缩后的文件大小差不多是原文件大小的1/5
  4. 压缩文件的权限和时间戳与原文件相同

常用的gzip选项

选项 描述
-c 将输出结果写入标准输出,保留原文件
-d 解压缩
-f 强制压缩,哪怕原文件的压缩文件已经存在
-l 列出压缩文件的压缩统计信息
-r 如果命令行参数是目录,则递归压缩目录中的文件
-t 测试压缩文件的完整性
-v 在压缩时显示详细信息

如下述示例

[[email protected] ~]# ls -l /etc > foo.txt
[[email protected] ~]# ls -l foo.*
-rw-r--r-- 1 root root 17246 Apr 22 16:44 foo.txt
[[email protected] ~]# gzip foo.txt
[[email protected] ~]# ls -l foo.*
-rw-r--r-- 1 root root 3410 Apr 22 16:44 foo.txt.gz
[[email protected] ~]# gunzip foo.txt.gz
[[email protected] ~]# ls -l foo.*
-rw-r--r-- 1 root root 17246 Apr 22 16:44 foo.txt
2.检查压缩文件的完整性
[[email protected] ~]# gzip foo.txt
[[email protected] ~]# gzip -tv foo.txt.gz
foo.txt.gz:      OK
3.解压缩
[[email protected] ~]# gzip -d foo.txt.gz
4.综合用法
[[email protected] ~]# ls -l /etc |gzip > foo.txt.gz
[[email protected] ~]# ls -l foo.*
-rw-r--r-- 1 root root 3402 Apr 22 16:52 foo.txt.gz
[[email protected] ~]#
           
用于解压gzip文件的gunzip程序假定文件扩展名为.gz,所以没有必要明确写出扩展名,只要指定的文件名不会与现有的非压缩文件冲突即可
[[email protected] ~]# ls -l /etc |gzip > foo.txt.gz
[[email protected] ~]# gunzip foo.txt
[[email protected] ~]# ls -l foo.*
-rw-r--r-- 1 root root 17246 Apr 22 16:55 foo.txt
[[email protected] ~]#
2.如果只是想看压缩的文本文件内容,可以这样做:
[[email protected] ~]# gunzip -c foo.txt |less
total 1496
drwxr-xr-x.  3 root root      101 May 12  2020 abrt
-rw-r--r--.  1 root root       16 May 12  2020 adjtime
.......
3.gzip附带了一个zcat程序,功能等同于gunzip -c
[[email protected] ~]# zcat foo.txt.gz |less
total 1496
drwxr-xr-x.  3 root root      101 May 12  2020 abrt
-rw-r--r--.  1 root root       16 May 12  2020 adjtime
           

3.bzip2

bzip2程序类似于gzip,但使用了不同的压缩算法,在牺牲压缩速度的情况下实现了更高的压缩率。其用法和gzip基本上类似。扩展名为.bz2代表经过bzip2压缩的文件。bzip2压缩程序现实使用场景较少,此处不做叙述。

4.tar(归档)

tar(磁带归档,tape archive)程序是UNIX系统一款经典的文件归档工具,它最初的用途就是磁带备份。我们经常会看到.tar和.tgz的文件,它们分别代表普通的tar归档文件和经过gzip压缩的归档。tar归档的组成可以是多个独立的文件,一个或多个目录层次或者两者兼而有之。

tar用法如下:

tar mode[option] pathname

tar常用模式

模式 描述
c 根据指定的一组文件或目录创建归档
x 提取归档内容
r 将指定的路径名追加到归档末尾
t 列出归档内容
1.创建tar归档
[[email protected] ~]# mkdir -p playground/dir-{001..100}
[[email protected] ~]# touch playground/dir-{001..100}/file-{A..Z}
[[email protected] ~]# tar cf playground.tar playground
注意:模式可以与其他选项合并书写,但模式必须先于其他选项出现。
2.列出归档内容
[[email protected] ~]# tar -tf playground.tar
playground/
playground/dir-001/
playground/dir-001/file-A
3.列出更详细的清单
[[email protected] ~]# tar -tvf playground.tar
4.将归档内容提取到新的位置
[[email protected] ~]# mkdir foo
[[email protected] ~]# cd foo
[[email protected] foo]# tar xf ../playground.tar
[[email protected] foo]#
注意:提取的时候注意一个问题,除非是以超级用户的身份操作,否则,从归档中提取出来的文件和目录的所有权属于执行提取操作的用户,而不再属于原先的属主。
           

另一个注意事项,tar处理归档中路径名的方式,默认采用相对路径,而不是绝对路径。在创建归档时,tar会直接去掉路径名最前面的正斜线。在使用绝对路径名归档文件时,将默认从文件名中删除该路径中的前面的/符号。删除路径中的前导/可帮助用户在提取存档时避免覆盖重要文件。tar命令相对于当前的工作目录提取文件。

警告:在创建tar存档之前,请先验证目录中没有其他存档与要创建的新存档名称相同。tar命令将覆盖现有的存档,而不提供警告。
[[email protected] foo]# cd
[[email protected] ~]# tar cf playground2.tar ~/playground
tar: Removing leading `/' from member names
[[email protected] ~]# cd foo
[[email protected] foo]# ls
playground
[[email protected] foo]# tar xf ../playground2.tar
[[email protected] foo]# ls
playground  root
[[email protected] foo]# cd root
[[email protected] root]# ls
playground
注意:我们可以看到,在提取第二个归档的时候,tar重新创建了目录root/playground,该目录是相对于当前工作目录~/foo的,而不是相对于根目录的。
           
  • 限制提取某些文件
默认情况下,从存档中提取文件时,将从存档内容的权限中去除UMASK。要保留存档文件的权限,可在提取存档时使用p选项。
[[email protected] root]# tar xf archive.tar pathname
在命令结尾加上pathname,tar就会只提取指定的文件,也可以指定多个路径名。注意,路径名必须和归档中保存的相对路径名一模一样。
[[email protected] ~]# tar xf playground2.tar root/playground/dir-001/file-A
           
  • tar配合find使用
[[email protected] tmp]# find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'
           
  • tar利用标准输入和标准输出
[[email protected] ~]# find playground -name 'file-A' |tar cf - --files-from=- | gzip > playground.tgz
--files-from选项(也可以写为-T),使tar从文件中而不是从命令行读取文件列表
           
  • 虽然可以将gzip作为外部程序来生成压缩归档文件,但现代的GNU版本tar通过z选项和j选项,直接支持gzip和bzip2压缩
[[email protected] ~]# find playground -name 'file-A' |tar czf palyground.tgz -T -
[[email protected] ~]# find playground -name 'file-A' |tar cjf palyground.tbz -T -
           
  1. tar命令支持三种压缩方式
  • gzip压缩速度最快,历史最久,使用也最广泛,能够跨发行版甚至跨平台使用。
  • bzip2压缩创建的存档文件通常比gzip创建的文件小,但可用性不如gzip广泛。
  • 而xz压缩方式相对较新,但通常提供可用方式中最佳的压缩率。
任何压缩算法的效用都取决于被压缩数据的类型。已经压缩过的数据文件,如压缩图片格式或RPM文件,通常导致较低的压缩率。

4.zip

zip既能压缩也能归档,常用于windows系统。本文不做详述

5.同步文件与目录

维护系统备份的常用策略包括保持一个或多个目录与本地主机(通常是某种可移动设备)或远程主机上的其他目录同步。在UNIX系统中,执行该任务的首选工具是rsync,它利用rsync远程更新协议(rsync remote-update protocol)同步本地目录和远程目录,该协议允许rsync快速检测两处目录之间的差异,执行使其达成同步所需的最少复制操作。相较于其他复制程序,rsync速度飞快,经济实用。

rsync的用法如下

rsync options source destination
           
  • source和destination必须有一个是本地的,rsync不支持远程对远程复制
  • 采用[user@]host:path形式指定远程的文件或目录
  • 采用rsync://[user@]hsot[:port]/path形式的URI指定的远程rsync服务器
1.测试本地同步
[[email protected] ~]# rm -rf foo/*
[[email protected] ~]# rsync -av playground foo
sending incremental file list
playground/
playground/dir-001/
-a选项(用于归档,执行递归操作并保留文件属性)和-v选项(详细输出),在foo目录中制作playground目录的镜像(miroor)文件。命令执行完成后,会显示汇总信息,说明复制了多少数据。
sent 147,829 bytes  received 49,894 bytes  131,815.33 bytes/sec
total size is 10,240  speedup is 0.05
2.再次执行命令,会看到不同的结果
[[email protected] ~]# rsync -av playground foo
sending incremental file list

sent 35,784 bytes  received 133 bytes  71,834.00 bytes/sec
total size is 10,240  speedup is 0.29

注意并没有出现文件列表,这是因为~/playground和~/foo/playground之间并没有什么差异,无须复制任何文件。如果我们修改playground中的某个文件,再次执行rsync:
[[email protected] ~]# touch playground/dir-099/file-Z
[[email protected] ~]# rsync -av playground foo
sending incremental file list
playground/dir-099/file-Z

sent 35,837 bytes  received 158 bytes  71,990.00 bytes/sec
total size is 10,240  speedup is 0.28
可以看到,rsync检测到了变化,只复制有更新的文件。
           

重要特性

在同步源的目录名称后加上斜杠/,rsync只会复制目录内容,而非目录本身。

1.不加斜杠
[[email protected] ~]# rsync -a source destination
[[email protected] ~]# ls destination
source
2.加斜杠
[[email protected] ~]# rsync -a source/ destination
[[email protected] ~]# ls destination
file01
           

操作系统重要目录备份

[[email protected] ~]# mkdir -p /media/BigDisk/backup
[[email protected] ~]# rsync -av --delete /etc /home /usr/local /media/BigDisk/backup
本例中,系统中的/etc,/home,/usr/local目录被复制到硬盘中。--delete选项,用于删除存在于备份设备,但源设备中已经不存在的文件。
2.使用别名,在.bashrc文件中,添加如下行。
alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup'
           

在网络上使用rsync

rsync的真正美妙之处在于能够在网络上复制文件,rsync中的r就代表“remote”。远程复制有两种方法,第一种针对安装了rsync和远程shell程序(例如ssh)的系统。

[[email protected] ~]# rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup
--rsh=ssh选项,用于指示rsync使用ssh程序作为其远程Shell,这样就能加密隧道将本地系统数据安全传输到远程系统。

           

第二种方法是使用rsync服务器,本文不做详述。

[[email protected] ~]# rsync -av --delete rsync://archive.linux.duke.edu/fedora/linux/os fedora-devel