1.目标
- 文件压缩程序
- gzip:压缩与解压缩文件
- bzip2:快排序文件压缩器
- 归档程序
- tar:磁带归档
- zip:压缩文件
- 文件同步程序
- rsync: 远程文件和目录同步
2.gzip
- gzip程序可以压缩单个或多个文件
- 程序执行后,原文件将被替换为file.gz文件
- 压缩后的文件大小差不多是原文件大小的1/5
- 压缩文件的权限和时间戳与原文件相同
常用的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 -
- 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