• Linux 命令行——gzip、gunzip、bzip、bunzip、tar、zip等命令


    本文摘录自 Linux 命令行

    1.备份和归档

    计算机系统管理员的一个主要任务就是保护计算机的数据安全,一种方法就是不时给文件做备份。即使你不是系统管理员,在你做拷贝和在各个设备和位置之间移动大量文件做备份总是没错的。我们这一部分学习用来管理文件集合的程序。

    2.文件压缩(compression)程序

    数据压缩技术是删除冗余数据的过程,压缩算法分为两大类:有损压缩和无损压缩。无损压缩保存了原文件的所有数据,压缩比接近 5:1,还原可以和原文件一模一样;有损压缩会去掉我们肉眼看不到的数据等,可达 200:1。

    1. gzip:压缩一个或多个文件。当执行 gzip 时,则生成的压缩文件会替代原文件(不保留原文件)。相对应的 gunzip 用来解压缩。
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    gzip 有很多选项,这里有一些常用的:

    选项描述
    -c把输出写入到标准输出且保存原始文件。–stdout
    -d解压缩。和 gunzip 一样。–decompress
    -f强制压缩,即使原始文件的压缩文件已经存在也会再压缩。
    -h显示用法信息,相当于 --help
    -l列出每个被压缩文件的压缩数据。–list
    -r若命令的一个或多个参数是目录,则递归的压缩目录中的文件。–recursive
    -t测试压缩文件的完整性。–test
    -v显示压缩过程中的信息。–verbose
    -number设置压缩指数。number是一个在1(最小压缩,最快)到9(最大压缩,最慢)之间的整数。默认整数6.
    1. bzip:与 gzip 类似,但是使用了不同的压缩算法,舍弃了压缩速度,而实现了更高的压缩级别。大多数情况下,它的工作模式等同于 gzip。由 bzip 压缩的文件,用 .bz2 来表示:
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 归档(Archiving)程序

    与文件压缩结合使用的一个常见文件管理任务是归档。归档就是收集许多文件然后将它们捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用,当把旧数据从一个系统迁移到某种类型的长期存储设备中时,也会用到归档。

    1. tar:在类 Unix 的软件世界里,tar 程序是归档文件的经典工具。它的名字,是 tape achive(磁带备份)的简称。我们经常看到 .tar 或 .tgz 的文件,它们表示普通的 tar 包和被 gzip 压缩过的 tar 包。一个 tar 包可以由一组独立的文件,一个或多个目录,或两者的混合体组成。命令语法如下:tar mode[options] pathname...
      这里的 mode 是指以下的操作模式之一:
      模式说明
      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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 通过给命令添加末尾的路径名,tar 命令就只会恢复指定的文件。可以指定多个路径名。GNU 版本的 tar 命令支持通配符:tar xf ../2020-01/Pics.tar --wildcards '/Users/chappyzhao/Downloads/pictures/Pics/2020-01/Pics/dir-\*/file-A':只抽取特定的路径名 file-A 到当前目录。

    2. 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 -
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. zip:zip 程序既是压缩工具也是打包工具。Windows 常用,Linux 中 gzip 是主要的,bzip2其次。zip -r Pics.zip Pics:除非加上 -r 选项,否则只有 Pics 目录被存储。
  • 相关阅读:
    适配高DPI QWidget::move移动有错误?
    【学习】目标检测中的anchor
    用std::condition_variable 实现的生产者,消费者同步的例子
    python 之xml 使用原生xml.dom
    【C++题解】1302. 是否适合晨练?
    国产化之虚拟ARM64-CPU安装银河麒麟操作系统
    LeetCode902最大为 N 的数字组合(相关话题:数位DP问题,递归遍历和减枝)
    软考-软件工程
    Java随笔-动态代理
    Qt 信号与槽
  • 原文地址:https://blog.csdn.net/weixin_43621315/article/details/125463756