参考文献

Linux的备份压缩

  • 最早的Linux备份介质是磁带,使用的命令是tar;
  • 可以打包的磁带文件进行压缩存储,压缩命令是gzipbzip2;
  • 经常使用的扩展名是:.tar.gz,.tar.bz2,.tgz

常见的压缩后缀

  • *.Z compress 程序压缩的档案;
  • *.bz2 bzip2 程序压缩的档案;
  • *.gz gzip 程序压缩的档案;
  • *.tar tar 程序打包的数据,并没有压缩过;
  • *.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩

tar格式

  • 注意tar是打包,不是压缩

    1
    Format: tar [primary option + secondary option] file or directory
    • Primary options(主要选项): they cannot be present at the same time, telling tar what to do is mandatory
      • -c:创建一个新的备份文件,相当于打包
      • -x: 从备份文件中释放文件,相当于解压
      • -t: 列出备份文件的内容
    • Secondary options(次要选项): Optional
      • -C:切换到指定目录
      • -z:是否也具有gzip的特性?也就是需要用gzip压缩或者解压吗?通常的格式是 gzxx.tgz
      • -j:是否也具有bzip2的特性?即是否需要使用 bzip2 进行压缩或解压缩?通常格式为bz2
      • -v:显示压缩过程中的文件
      • -f:指定压缩文件,注意文件名应紧跟在f(你自己的)后面,不要添加其他参数。
      • -p:使用原始文件的原始属性
      • -exclude FILE:压缩过程中不打包FILE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
tar (选项) (参数)
-A或--catenate:新增文件到以存在的备份文件;
-B:设置区块大小;
-c或--create:建立新的备份文件;
-C <目录>:切换工作目录,先进入指定目录再执行压缩/解压缩操作,可用于仅压缩特定目录里的内容或解压缩到特定目录;
-d:记录文件的差别;
-x或--extract或--get:从归档文件中提取文件,可以搭配-C(大写)在特定目录解开,
需要注意的是-c、-t、-x不可同时出现在一串命令中;
-t或--list:列出备份文件的内容;
-z或--gzip或--ungzip:通过gzip指令压缩/解压缩文件,文件名最好为*.tar.gz;
-Z或--compress或--uncompress:通过compress指令处理备份文件;
-f<备份文件>或--file=<备份文件>:指定备份文件;
-v或--verbose:显示指令执行过程;
-r:添加文件到已经压缩的文件;
-u:添加改变了和现有的文件到已经存在的压缩文件;
-j:通过bzip2指令压缩/解压缩文件,文件名最好为*.tar.bz2;
-v:显示操作过程;
-l:文件系统边界设置;
-k:保留原有文件不覆盖;
-m:保留文件不被覆盖;
-W:确认压缩文件的正确性;
-p或--same-permissions:保留原来的文件权限与属性;
-P或--absolute-names:使用文件名的绝对路径,不移除文件名称前的“/”号;
-N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
--exclude=<范本样式>:排除符合范本样式的文件;
--remove-files:归档/压缩之后删除源文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拼接多个tar文件
tar -Af file1.tar file2.tar

# 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
tar -cf all.tar *.jpg

# 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -rf all.tar *.gif

# 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
tar -uf all.tar logo.gif

# 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
tar -tf all.tar

# 在归档完成之后打印出总归档的字节数
tar -cf 1.tar adsd_ad.txt --totals
Total bytes written: 10240 (10KiB, 34MiB/s)

1
2
3
4
tar格式(该格式仅仅打包,不压缩)
打包:tar -cvf [目标文件名].tar [原文件名/目录名]
解包:tar -xvf [原文件名].tar
注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。

压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 仅打包,不压缩!
tar -cvf log.tar log2012.log
# 打包后,以 gzip 压缩
tar -zcvf log.tar.gz log2012.log
# 打包后,以 bzip2 压缩
tar -jcvf log.tar.bz2 log2012.log
# 文件备份下来,并且保存其权限 这个-p的属性是很重要的,尤其是当您要保留原本文件的属性时。
tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log#
# 在文件夹当中,比某个日期新的文件才备份 :
tar -N "2012/11/13" -zcvf log17.tar.gz test
# 备份文件夹内容是排除部分文件:
tar --exclude scf/service -zcvf scf.tar.gz scf/*
# 打包文件之后删除源文件:
tar -cvf test.tar test --remove-files

解压

1
2
3
tar -xvf file or directory name

tar -zxvf file or directory name

tar.gz格式

  • 方式一:利用前面已经打包好的tar文件,直接用压缩命令。

    • 压缩:gzip [原文件名].tar
    • 解压:gunzip[原文件名].tar.gz
  • 方式二:一次性打包并压缩、解压并解包

    • 打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]
    • 解压并解包: tar -zxvf [原文件名].tar.gz
    • 注:z代表用gzip算法来压缩/解压。

tar.bz2格式

  • 方式一:利用已经打包好的tar文件,直接执行压缩命令:
    • 压缩:bzip2 [原文件名].tar
    • 解压:bunzip2 [原文件名].tar.bz2
  • 方式二:一次性打包并压缩、解压并解包
    • 打包并压缩: tar -jcvf [目标文件名].tar.bz2 [原文件名/目录名]
    • 解压并解包: tar -jxvf [原文件名].tar.bz2
    • 注:小写j代表用bzip2算法来压缩/解压。

tar.xz格式

  • 方式一:利用已经打包好的tar文件,直接用压缩命令:
    • 压缩:xz [原文件名].tar
    • 解压:unxz [原文件名].tar.xz
  • 方式二:一次性打包并压缩、解压并解包
    • 打包并压缩: tar -Jcvf [目标文件名].tar.xz [原文件名/目录名]
    • 解压并解包: tar -Jxvf [原文件名].tar.xz
    • 注:大写J代表用xz算法来压缩/解压。

tar.Z格式

  • 压缩: tar Zcvf filename.tar.Z dirname
  • 解压: tar Zxvf filename.tar.Z

zip格式

1
2
3
4
zip格式
压缩: zip -r [目标文件名].zip [原文件/目录名]
解压: unzip [原文件名].zip
注:-r参数代表递归
  • 快速预览压缩包文件

    1
    2
    3
    $ zipinfo archive_name.zip
    # 或者也可以用
    $ unzip -l archive_name.zip

解压多个文件

  • 假设当前目录下有多个zip文件data.zip data2.zip data3.zip data3.zip

    • 直接unzip *.zip等价于unzip data.zip data2.zip data3.zip data3.zip会报错

      1
      2
      3
      4
      Archive: data.zip
      caution: filename not matched: invoices.zip
      caution: filename not matched: pictures.zip
      caution: filename not matched: visit.zip
    • 因为会认为后面三个zip文件是在第一个zip文件里面的,因此需要
      unzip '*.zip'或者unzip "*.zip"或者unzip \*.zip或者for z in *.zip; do unzip $z; done

jar格式

  • 压缩:jar -cvf [目标文件名].jar [原文件名/目录名]
  • 解压:jar -xvf [原文件名].jar

7z格式

  • 压缩:7z a [目标文件名].7z [原文件名/目录名]
  • 解压:7z x [原文件名].7z
  • 注:这个7z解压命令支持rar格式,即:7z x [原文件名].rar

.Z格式

  • 压缩: compress FileName
  • 解压: uncompress FileName.Z

.rar格式

  • .rar是Windows中最常见的压缩文件格式,在Linux中需要安装rarlinux才能使用,官方:http://www.rarsoft.com/download.htm

    1
    2
    3
    wget http://www.rarsoft.com/rar/rarlinux-x64-5.4.0.tar.gz
    cd rar
    make && make install
  • 压缩: rar a filename.rar dirname

  • 解压: rar x filename.rar

分卷压缩

  • 举例:将10G大小的log文件2017.log打包压缩并分割成多个100m的文件

    1
    2
    3
    4
    5
    6
    7
    8
    # 分卷压缩gz
    tar zcf - 2017.log |split -d -b 100m - logs.tar.gz.
    # ↑ ↑
    # 生成文件: logs.tar.gz.00 logs.tar.gz.01
    # 分卷压缩bz2
    tar jcf - 2017.log |split -d -b 100m - logs.tar.bz2.
    # ↑ ↑
    # 生成文件: logs.tar.bz2.00 logs.tar.bz2.01
    • 那两个-不要漏了,那是tarouputsplitinput的参数
  • 合并分卷解压缩

    1
    2
    3
    4
    5
    6
    # 解压gz分卷
    cat logs.tar.gz* | tar zx
    # 显示进度
    cat logs.tar.gz* | pv | tar zx
    # 解压bz2分卷
    cat logs.tar.gz* | tar jx