Bash 归档和备份详解

gzip

gzip 程序用来压缩文件,原文件的压缩版(添加gz后缀名)会替代原文件。gunzip 程序用来还原压缩版本。

$ gzip foo.txt
$ gunzip foo.txt.gz

gzip的参数如下。

下面是一些例子。

# 查看解压缩后的内容
$ gunzip -c foo.txt | less

zcat程序等同于带有-c 选项的 gunzip 命令。它可以像cat命令那样,用来查看gzip压缩文件。

$ zcat foo.txt.gz | less

bzip2

bzip2程序与gzip程序相似,但是使用了不同的压缩算法,舍弃了压缩速度,实现了更高的压缩级别。在大多数情况下,它的工作模式等同于gzip。 由bzip2压缩的文件,用扩展名.bz2表示。

$ bzip2 foo.txt
$ bunzip2 foo.txt.bz2

gzip程序的所有选项(除了-r),bzip2 程序同样也支持。同样有 bunzip2 和 bzcat 程序来解压缩文件。bzip2 文件也带有 bzip2recover 程序,其会 试图恢复受损的 .bz2 文件。

zip

zip程序既是压缩工具,也是一个打包工具,读取和写入.zip文件。

$ zip options zipfile file...

它的用法如下。

# 将指定目录压缩成zip文件
$ zip -r playground.zip playground

ziptar命令有一个相反之处。如果压缩文件已存在,其将被更新而不是被替代。这意味着会保留此文件包,但是会添加新文件,同时替换匹配的文件。

解压使用unzip命令。

$ unzip ../playground.zip

unzip命令的参数如下。

  • -l 列出文件包中的内容而不解压
  • -v 显示冗余信息
  • -p 输出发送到标准输出
$ unzip -p ls-etc.zip | less

tar

tar是tape archive的简称,原来是一款制作磁带备份的工具,现在主要用于打包。一个 tar 包可以由一组独立的文件,一个或者多个目录,或者两者混合体组成。

tar程序的语法如下。

$ tar mode[options] pathname...

tar支持以下模式。

  • c 表示create,为文件和/或目录列表创建归档文件。
  • x 抽取归档文件。
  • r 追加具体的路径到归档文件的末尾。
  • t 列出归档文件的内容。

支持的参数如下。

  • f 表示file,用来指定生成的文件。

模式和参数可以写在一起,而且不需要开头的短横线。注意,必须首先指定模式,然后才是其它的选项。

# 创建子目录的tar包
$ tar cf playground.tar playground

# 查看tar包内容
$ tar tf playground.tar

# 查看更详细的列表信息
$ tar tvf playground.tar

# 还原归档文件
$ tar xf playground.tar

# 还原单个文件
$ tar xf archive.tar pathname

# 还原文件到指定目录
$ tar xvf archive.tar -C /home/me/

# 追加文件
$ tar rf archive.tar file.txt

# 验证归档文件内容是否正确
$ tar tvfW archive.tar

# 支持通配符
$ tar xf ../playground2.tar --wildcards 'home/me/playground/\*.txt'

注意,tar命令还原的时候,总是还原为相对路径。如果归档的时候,保存的是绝对路径,那么还原的时候,这个绝对路径会整个变成相对路径。

find命令可以与tar命令配合使用。

$ find playground -name 'file.txt' -exec tar rf playground.tar '{}' '+'

上面的命令先用find程序找到所有名为file.txt的文件,然后使用追加模式(r)的tar命令,把匹配的文件添加到归档文件playground.tar里面。

这种tarfind的配合使用,可以创建逐渐增加的目录树或者整个系统的备份。通过find命令匹配新于某个时间戳的文件,我们就能够创建一个归档文件,其只包含新于上一个 tar 包的文件。

tar支持压缩功能。

# 打成gzip压缩包
$ tar czvf assets.tar.gz dist

# 打成bz2压缩包
$ tar cvfj assets.tar.bz2 dist

# 解压 tar.gz 文件
$ tar xzv archive.tar.gz
$ tar xvf archive.tar.gz

# 解压bz2压缩包
$ tar xvf archive.tar.bz2

# 显示gzip压缩包内容
$ tar tvf archive.tar.gz

# 显示bz2压缩包内容
$ tar tvf archive.tar.bz2

# 从gzip压缩包取出单个文件
$ tar zxvf archive.tar.gz file.txt

# 从bz2压缩包取出单个文件
$ tar jxvf archive.tar.bz2 file.txt

# 按通配符取出文件
$ tar zxvf archive.tar.gz --wildcards '*.php'
$ tar jxvf archive.tar.bz2 --wildcards '*.php'

# 追加文件到压缩包
$ tar rvf archive.tar.gz xyz.txt
$ tar rvf archive.tar.bz2 xyz.txt

rsync

rsync命令用于在多个目录之间、或者本地与远程目录之间同步。字母r表示remote

$ rsync options source destination

source 和 destination 是下列选项之一:

  • 一个本地文件或目录
  • 一个远端文件或目录,以[user@]host:path的形式存在
  • 一个远端 rsync 服务器,由rsync://[user@]host[:port]/path指定

注意 source 和 destination 两者之一必须是本地文件。rsync 不支持远端到远端的复制。

rsync命令的参数如下。

  • -a 递归和保护文件属性
  • -v 冗余输出
  • --delete 删除可能在备份设备中已经存在但却不再存在于源设备中的文件
  • --rsh=ssh 使用 ssh 程序作为远程 shell,目的地必须标注主机名。
# 同步两个本地目录
$ rsync -av playground foo

# 删除源设备不存在的文件
$ sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup

# 远程同步
$ sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup

# 与远程rsync主机同步
$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/path/to/oss fedora-devel

教程来源于Github,感谢大佬的无私奉献,致敬!

技术教程推荐

Go语言核心36讲 -〔郝林〕

算法面试通关40讲 -〔覃超〕

Vue开发实战 -〔唐金州〕

说透中台 -〔王健〕

Kafka核心源码解读 -〔胡夕〕

容器实战高手课 -〔李程远〕

etcd实战课 -〔唐聪〕

手把手带你搭建推荐系统 -〔黄鸿波〕

结构写作力 -〔李忠秋〕