前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打包压缩加密备份_bash笔记6

打包压缩加密备份_bash笔记6

作者头像
ayqy贾杰
发布2019-06-12 12:25:22
1.1K0
发布2019-06-12 12:25:22
举报
文章被收录于专栏:黯羽轻扬黯羽轻扬

tar

tape archives,用来打包文件,文件格式具备可移植性

打包(或者叫归档,因为不压缩):

代码语言:javascript
复制
# -c创建文件,-f指定文件名
tar -cf bundle.tar file1 file2...
# 支持通配符
tar -cf bash_bundle.tar "*.sh"

追加:

代码语言:javascript
复制
# -r向已存在的包中添加一个文件
tar -rf bash_bundle.tar new.sh
# 对比时间戳,比同名文件新的话才添加
# vv是为了输出详细日志,没有就表示文件不新,没往进塞
tar -uvvf bash_bundle.tar new.sh

删除:

代码语言:javascript
复制
# --delete删除包里的文件
tar -f sh.tar --delete test.sh

P.S.Mac下没有--delete选项

查看:

代码语言:javascript
复制
# -t查看包内容
tar -tf bash_bundle.tar
# -v看详细点的(文件权限、修改日期,类似于ls -l)
tar -tvf bash_bundle.tar
# -vv看更详细的(比上面多一行包文件格式信息)
tar -tvvf bash_bundle.tar

P.S.-v-vv可以配合其它选项,用来输出log

提取(解压):

代码语言:javascript
复制
# -x提取到当前目录
tar -xf bash_bundle.tar
# -C提取到指定目录(目录必须已存在,否则报错)
tar -xf bash_bundle.tar -C ./tmp
# 只提取指定文件
tar -C ./tmp -xf bash_bundle.tar ab.diff

奇怪的技巧:

代码语言:javascript
复制
# stdin/stdout
# 把打包结果输出到stdout
tar -cf - test.sh
# 从stdin读取包内容
tar -xf - -C ./tmp test.sh

配合ssh,就能一管子插到远程机器上,批量传输文件:

代码语言:javascript
复制
# 本地打包,远程提取(用来同步目录)
tar -cf - test.sh | ssh <user>@<IP> "mkdir -p ~/tmp/sh; tar -xf - -C ~/tmp/sh"
# 本地打包,远程保存(用来批量上传文件)
tar -cf - test.sh | ssh jiajiejie.jj@10.125.1.214 "mkdir -p ~/tmp; cat > ~/tmp/sh.tar"
# 把远程文件提取到本地(用来批量下载文件)
ssh jiajiejie.jj@10.125.1.214 "cat ~/tmp/sh.tar" | tar -xf - -C ./tmp

减少中间文件,减少读写磁盘,效率更高一些

tar默认只是归档,用来打包文件,不压缩,提供了压缩选项:

代码语言:javascript
复制
# -z压缩为zip格式
tar -a -cf bash.tar.gz "*.sh"
# -j压缩为bunzip2格式
tar -a -cf bash.tar.bz2 "*.sh"
# --lzma压缩为lzma格式(Mac下没有该选项)
tar -a -cf bash.tar.lzma
tar -a -cf filename.tar.lzo

-a/--autocompress选项能够根据文件名自动选择压缩格式,如上例。解压时需要指定压缩格式,如常见的编译安装方法:

代码语言:javascript
复制
# 下载源码
wget http://path/to/source.tar.gz
# 解压
tar -zxvf source.tar.gz
# 或者,-a自动检测压缩格式
tar -axvf source.tar.gz
# 三板斧
cd source
./configure
make
make install

其它选项和用法:

代码语言:javascript
复制
# -A合并包(把2合并到1)
tar -Af bundle1.tar bundle2.tar
# -d比较包里外的文件
tar -df sh1.tar test.sh
# --exclude排除指定文件(排除md文件)
tar -cf bundle.tar "*" --exclude "*.md"
# 或者把需要排除的文件名写入文件,通过-X选项排除
echo "*.md" > tar.ignore
tar -cf bundle.tar "*" -X tar.ignore
# 排除版本控制目录(.git, .svn之类的)
tar --exclude-vcs -zcvf proj.tar.gz ./proj
# --totals输出包文件大小
tar -zcvf dir.tar.gz "*" --totals

P.S.Mac下没有-d--totals选项,低版本tar不支持--exclude-vcs

cpio

tar类似,从stdin接收输入文件名,并把打包文件输出到stdout,多用于rpm软件包,不常用

特点是支持绝对路径tar打包时会把绝对路径转相对路径,cpio不转,如果打包时输入了绝对路径,提取时也按绝对路径恢复,否则,与tar一样,提取到当前目录:

代码语言:javascript
复制
# 只能从stdin接收文件名
# 打包,-o指定输出文件名,-v输出文件列表
find . -name "*.sh" -print | cpio -ov > bash.cpio
# 查看,-i指定输入包名,-t列出包内容
cpio -vit < bundle.cpio
# 提取,-d表示提取操作
cpio -vid < bundle.cpio

注意:cpio覆盖文件没有提示,如果绝对路径对应的文件已存在且比较旧,会被静默替换掉。提取时会自动对比时间戳,如果包里文件新,就替掉,否则跳过提取该文件

P.S.用cpio解压rpm包需要先把rpm包转成cpio包,需要rpm2cpio工具

gzip/gunzip、zcat

这3个命令都能处理gzip压缩文件,gzip命令只能压缩单文件,无法直接处理目录和多个文件。所以一般先用tar命令打包,再用gzip压缩

gzip/gunzip

压缩:

代码语言:javascript
复制
# 会删除test.sh,再生成test.sh.gz
gzip test.sh

解压:

代码语言:javascript
复制
# 删除test.sh.gz,生成test.sh
gunzip test.sh.gz

查看:

代码语言:javascript
复制
# -l列出包内文件名、压缩前后大小、压缩比
gzip -l test.sh.gz

也配合stdin/stdout使用:

代码语言:javascript
复制
# -c输出到stdout
cat sub.sh | gzip -c > sub.sh.gz

这样就保留了原文件sub.sh

其它选项和用法:

代码语言:javascript
复制
# --fast/--best指定压缩级别,分别对应最低/最高压缩比
# 一共有9级,--fast对应1,--best对应9
gzip test.sh --fast
# 等价于
gzip test.sh -1
# tar的-z选项使用gzip压缩
tar -zcvf bash.tar.gz "*.sh"
# 或者,-a自动检测压缩格式
tar -acvf bash.tar.gz "*.sh"
# 或者,先打包再压缩
tar -cvf bash.tar "*.sh"; gzip bash.tar

zcat

不解压,直接读取gzip压缩文件内容,输出到stdout

代码语言:javascript
复制
# 读取gz文件内容
zcat test.sh.gz

P.S.在Mac下zcat会强制给输入文件名添上.Z后缀,导致报错:

zcat: can’t stat: sub.sh.gz (sub.sh.gz.Z): No such file or directory

所以为了保证可移植性,不建议用zcat,可以用gunzip -c代替,更多信息请查看zcat on OS X always appends a .Z to the filename (better use gunzip -c)

bzip2/bunzip2

一般情况下,比gzip压缩比更高,用法与gzip完全一致:

代码语言:javascript
复制
# 压缩
# 会删除test.sh,生成test.sh.bz2
bzip2 test.sh
# 解压
bunzip2 test.sh.bz2

实测发现对于文本文件test.sh,同样火力全开(-9)的情况下,bzip2gzip的压缩比还稍低一点:

代码语言:javascript
复制
-rwxr-xr-x  1 ayqy  staff  1064  4  9 16:31 test.sh
-rwxr-xr-x  1 ayqy  staff  682  4  9 16:31 test.sh.bz2
-rwxr-xr-x  1 ayqy  staff  632  4  9 16:31 test.sh.gz

同样,gzip有的bzip2几乎都有:

代码语言:javascript
复制
# 指定压缩级别
bzip2 -1 test.sh
# tar -j选项压缩成bz2
tar -jcvf bash.tar.gz "*.sh"
# ...同gzip

另外,还有一些独有特性(bzip2有,而gzip没有的):

代码语言:javascript
复制
# -k保留输入文件
bzip2 -k test.sh

P.S.还有一个新一些的压缩工具叫lzma/unlzma,据说压缩比更高,一般不给预装,需要手动装一个,用法与gzip/bzip2一样,二者的所有选项都支持

zip

非常常见的压缩格式,压缩比不很高,但很多网络资源都是这个格式

压缩:

代码语言:javascript
复制
# 生成test.sh.zip,不删除test.sh
zip test.sh.zip test.sh
# -r递归处理目录
zip -r bundle.zip .

解压:

代码语言:javascript
复制
# 解压到当前目录,不会删除test.sh.zip
unzip test.sh.zip

如果发现目标文件已存在,会提示选项是否替换/重命名/取消

更新:

代码语言:javascript
复制
# -u用新文件替掉包里的
zip test.sh.zip -u test.sh

删除:

代码语言:javascript
复制
# -d删除包里指定文件
zip -d test.sh.zip test.sh

查看:

代码语言:javascript
复制
# -l列出包内容
unzip -l test.sh.zip

加密/编码

linux提供了很多加密/编码工具:crypt, gpg, base64等等

crypt

stdin接收文件输入和口令,把加密结果输出到stdout

加密:

代码语言:javascript
复制
# 交互提示输入口令
crypt < test.sh
# 把加密结果重定向到文件
crypt < test.sh > test.lock.sh

解密:

代码语言:javascript
复制
# 同样,只接受来自stdin的,只输出到stdout
crypt 口令 < test.lock.sh > test.sh

P.S.Mac下没有该命令

gpg

GUN privacy guard,采用密钥签名方式,简单用法如下:

代码语言:javascript
复制
# 加密,交互提示输入口令,生成test.sh.gpg
gpg -c test.sh
# 解密,交互提示输入口令
gpg test.sh.gpg

P.S.Mac下没有该命令

base64

与上面2个命令不同,因为很容易解码,与明文没什么区别,只能算作编码方式:

代码语言:javascript
复制
# 编码
base64 test.sh > test.sh.base64
# 解码
base64 -D test.sh.base64 > test.sh

rsync

rsync用来备份系统快照,自带diff和压缩机制,比scp等命令高效,此外还支持网络数据传输,会比较源和目标端的文件,只复制备份更新的,也支持加密选项

备份:

代码语言:javascript
复制
# 备份到本地
# 在当前目录创建bash.bak/bash,复制下面所有内容
# -a归档,-v输出log
rsync -av bash bash.bak
# 备份到远程
rsync -av bash ayqy@<IP>:~/bak

注意:路径格式有讲究,如果源路径结尾有/,就只复制下面所有文件/子文件到目标路径,否则在目标路径下创建对应文件夹,再复制下面所有文件/子文件。一句话,有/不创建文件夹,目标路径结尾的/含义类似

定期备份只需要定期执行相同的命令,自动检查差异和更新并备份

恢复:

代码语言:javascript
复制
# 从本地恢复
rsync -av bash.bak bash
# 从远端恢复
rsync -av ayqy@<IP>:~/bak bash

交换参数位置即可

其它选项和特性:

代码语言:javascript
复制
# -z压缩传输
rsync -zav bash bash.bak
# --exclude排除指定文件
rsync -av bash bash.bak --exclude "*.md"
# --delete备份时删除不存在的文件,默认不会删掉源端已经删掉的东西
rsync -av bash bash.bak --exclude --delete
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端向后 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • tar
  • cpio
  • gzip/gunzip、zcat
    • gzip/gunzip
      • zcat
      • bzip2/bunzip2
      • zip
      • 加密/编码
        • crypt
          • gpg
            • base64
            • rsync
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档