本文摘录自 Linux 命令行
计算机系统管理员的一个主要任务就是保护计算机的数据安全,一种方法就是不时给文件做备份。即使你不是系统管理员,在你做拷贝和在各个设备和位置之间移动大量文件做备份总是没错的。我们这一部分学习用来管理文件集合的程序。
数据压缩技术是删除冗余数据的过程,压缩算法分为两大类:有损压缩和无损压缩。无损压缩保存了原文件的所有数据,压缩比接近 5:1,还原可以和原文件一模一样;有损压缩会去掉我们肉眼看不到的数据等,可达 200:1。
chappyzhao@ChappydeMacBook-Pro Pics % ls -l /bin > timestamp
chappyzhao@ChappydeMacBook-Pro Pics % ls -l timestamp
-rw-r--r-- 1 chappyzhao staff 1874 6 6 17:18 timestamp
chappyzhao@ChappydeMacBook-Pro Pics % gzip timestamp
# 可以看到原始文件大约被压缩了 5 倍
chappyzhao@ChappydeMacBook-Pro Pics % ls -l timestamp.*
-rw-r--r-- 1 chappyzhao staff 390 6 6 17:18 timestamp.gz
chappyzhao@ChappydeMacBook-Pro Pics % gunzip timestamp.gz
chappyzhao@ChappydeMacBook-Pro Pics % ls -l timestamp
-rw-r--r-- 1 chappyzhao staff 1874 6 6 17:18 timestamp
# 使用下面的命令可以将 foo.txt 文件压缩并将 /etc 目录写入压缩文件
ls -l /etc | gzip > foo.tx.gz
# 为了浏览压缩文件内容,我们可以这样做
root@bogon Pics # gunzip -c foo.txt.gz | less
gzip 有很多选项,这里有一些常用的:
选项 | 描述 |
---|---|
-c | 把输出写入到标准输出且保存原始文件。–stdout |
-d | 解压缩。和 gunzip 一样。–decompress |
-f | 强制压缩,即使原始文件的压缩文件已经存在也会再压缩。 |
-h | 显示用法信息,相当于 --help |
-l | 列出每个被压缩文件的压缩数据。–list |
-r | 若命令的一个或多个参数是目录,则递归的压缩目录中的文件。–recursive |
-t | 测试压缩文件的完整性。–test |
-v | 显示压缩过程中的信息。–verbose |
-number | 设置压缩指数。number是一个在1(最小压缩,最快)到9(最大压缩,最慢)之间的整数。默认整数6. |
root@bogon Pics # ls -l /etc > foo.txt
root@bogon Pics # ls -l foo.txt
-rw-r--r-- 1 chappyzhao staff 62 6 7 14:18 foo.txt
root@bogon Pics # bzip2 foo.txt
# 这里我们发现较小的文件压缩后比之前还大,因为每次压缩时,压缩算法都会给文件添加描述此次压缩过程的信息。
root@bogon Pics # ls -l foo.txt.bz2
-rw-r--r-- 1 chappyzhao staff 93 6 7 14:18 foo.txt.bz2
root@bogon Pics # bunzip2 foo.txt.bz2
与文件压缩结合使用的一个常见文件管理任务是归档。归档就是收集许多文件然后将它们捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用,当把旧数据从一个系统迁移到某种类型的长期存储设备中时,也会用到归档。
tar mode[options] pathname...
模式 | 说明 |
---|---|
c | 为文件/目录列表创建归档 |
x | 抽取归档文件 |
r | 追加具体的路径到归档文件的末尾 |
t | 列出归档文件的内容 |
# 创建整个目录的 tar 包
tar cf Pics.tar /Users/chappyzhao/Downloads/pictures/Pics/2020-01/Pics
# 列出归档的内容
tar tf Pics.tar
# 列出归档的详细内容➕v
tar tfv Pics.tar
# 抽取 tar 包到新的位置,会将归档的内容重新打开放到这个目录下。除非是超级用户,否则抽取出的所有权归操作用户所有
tar xf ../2020-01/Pics.tar
通过给命令添加末尾的路径名,tar 命令就只会恢复指定的文件。可以指定多个路径名。GNU 版本的 tar 命令支持通配符:tar xf ../2020-01/Pics.tar --wildcards '/Users/chappyzhao/Downloads/pictures/Pics/2020-01/Pics/dir-\*/file-A'
:只抽取特定的路径名 file-A 到当前目录。
tar 经常和 find 命令来制作归档文件。
# 找到所有的 file-A 文件添加到 playground.tar 后面
find playground/ -name 'file-A' -exec tar rf playground.tar '{}' '+'
# 我们先用 find 查找出了匹配文件列表,然后把它们管道到 tar 命令中。如果指定了文件名“-”,就会被看为标准输入输出(使用“-”来表示标准输入输出是很多程序的惯例)。--file-from 选项(也可以用 -T)导致 tar 命令从一个文件而不是命令行来读取数据。最后,这个由tar 产生的归档数据被 管道到 gzip 命令中,然后创建了归档压缩文件 tgz。有时也会用 tar.gz。
find Pics -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz
# 上面示例我们可以这样简化它,下面分别是 gzip 压缩和 bzip2 压缩
root@bogon 2020-01 # find Pics -name 'file-C' | tar czf Pics.tgz -T -
root@bogon 2020-01 # find Pics -name 'file-C' | tar cjf Pics.tbz -T -
zip -r Pics.zip Pics
:除非加上 -r 选项,否则只有 Pics 目录被存储。