[关闭]
@1405010304geshuaishuai 2017-07-18T06:19:33.000000Z 字数 3157 阅读 632

打包指令:tar

Linux 打包 tar


tar

虽然gzip,bzip2,xz也能够针对目录来进行压缩,不过,这两个指令对目录的压缩是指“将目录内的所有文档分别进行压缩”的动作。
tar可以将多个目录或档案打包成一个大档案,同时还可以通过gzip/bzip2/xz的支援,将该文档同时进行压缩。

  1. $ tar [-z|-j|-J][cv][-f 待建立的新档名] filename... //打包与压缩
  2. $ tar [-z|-j|-J][tv][-f 既有的tar档名] //查看档名
  3. $ tar [-z|-j|-J][xv][-f 既有的tar档名] [-C 目录] //解压缩

选项与参数:

  1. -c : 建立打包档案,可搭配-v来查看过程中被打包的档名(filename)
  2. -t : 查看打包档案的内容有哪些档名,重点在查看“档名”就是了
  3. -x : 解打包或解压缩的功能,可以搭配-C(大写)在特定目录解开
  4. 特别留意的是,-c,-t,-x不可同时出现在一串指令列中。
  5. -z : 通过gzip的支援进行压缩/解压缩:此时档名最好为*.tar.gz
  6. -j : 通过bzip2的支援进行压缩/解压缩:此时档名最好为*.tar.bz2
  7. -J : 通过xz的支援进行压缩/解压缩:此时档名最好为*.tar.xz
  8. 特别留意,-z,-j,-J不可以同时出现在一串指令列中
  9. -v : 在压缩/解压缩的过程中,将正在处理的档名显示出来!
  10. -f filename : -f后面要立刻接要被处理的档名!建议-f单独与一个选项
  11. -C 目录 : 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
  12. -p : 保留备份资料的原本的权限属性,常用于备份重要的设定档
  13. -P(大写p : 保留绝对路径,亦即允许备份资料中含有根目录存在之意
  14. --exclude=FILE : 在压缩的过程中,不要将FILE打包!
  1. *压缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称
  2. *查询:tar -jtv -f filename.tar.bz2
  3. *解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
  4. filename.tar.bz2是我们自己取的档名,tar并不会主动产生建立的档名。

范例:使用tar加入-z,-j或-J的参数备份/etc/目录
tar_1
tar_2
由于加上-v这个选项,因此正在作用中的档名就会显示在屏幕上。
tar_3
tar_4
tar_5
tar_6
显示的信息会跟上面一模一样,不过时间会花比较多!使用了-J时,会花更多时间
tar_7
至于-p的选项,重点在于“保留原本档案的权限于属性”之意。

由于上面的打包例子中文件太多所以一开始的警告信息并没有看到,所以此处我建立一个test文件来显示警告信息,后面的试验中会用到。
tar_8
注意此处的警告信息下面会用到。
范例 :查阅tar档案的资料内容(可查看档名),与备份档名有否根目录的意思
tar_9
tar_10

加上-v选项,详细的档案权限/属性都会被列出来!如果只是想知道档名而已,那么就将-v拿掉
从上面的资料我们可以发现一件很有趣的事情,那就是每个档名都没了根目录了!这也上上一个test案例中出现的那个警告信息"tar: Removing leading '/' from member names(移除了档名的开头的'/')"所告知的情况!
那为什么要拿掉根目录呢?主要是为了安全!我们使用tar备份的资料可能会需要解压缩回来使用,在tar所记录的档名(就是我们刚刚使用 tar -jtvf所查看到的档名)那就是解压缩后你的真是档名。如果拿掉了根目录,假设你将备份资料在/tmp解开,那么解压缩的档名会变成"/tmp/etc/xxx",如果没有拿掉根目录,解压缩后的档名就会是绝对路径,亦即解压缩后的资料一定会被放置到/etc/xxx去!如此一来,你的原本的/etc/底下的资料,就会被备份资料所覆盖过去!

如果你确定你就是需要备份根目录到tar的档案中,那可以使用-P(大写)这个选项。

范例:将档案名中的(根)目录也备份下来,并查看一下备份档中的内容档名
tar_10_1
查看上面压缩的文件内容

  1. # tar -jtf /root/etc.tar.bz2

tar_10_2
要想指定欲解开的目录可以使用-C这个选项。

范例:仅解开单一档案的方法
如果我只想解开打包档案内的其中一个档案而已,那该如何做呢?你只要使用-jtv找到你要的档名,然后将该档名解开即可。
1.先找到我们要的档名,假设解开shadow档案:

tar_10_3

2.将该档案解开:

tar_10_4

范例:打包某目录,但不含该目录下的某些档案之做法

假设我们想要打包/etc/ /root这几个重要的目录,但却不想要打包/root/etc*开头的档案,因为该档案都是刚刚我们才建立的备份文档,而且假设这个新的打包档案要放置成为/root/system.bar.bz2,当然这个档案自己不要打包自己(因为这个档案放置在/root底下啊),此时我们可以通过--exclude的帮忙!那个exclude就是不包含的意思!

tar_11
通过这个--exclude="file"的动作,我们可以将几个特殊的档案或目录移除在打包之列,让打包的动作变的更加简单。

范例:仅备份比某时刻还要新的档案
--newer-mtime这个选项就很重要,其实有两个选项啦,一个是--newer另一个就是--newer-mtime,这两个选项有何不同?当使用--newer时,表示后续的日期包含mtime与ctime而--newer-mtime则仅是mtime而已。

1.先由find找出比/etc/passwd还要新的档案
newer_1
(过程省略)
此时会显示出比/etc/passwd这个档案的mtime还要新的档名
newer_2

2.好了,那么使用tar来进行打包吧!日期为上面看到的2017/06/21
newer_3

3.显示出档案即可
newer_4
通过这个指令可以呼出tar.bz2内的结尾非/的档名!就是我们想要的啦!

这个指令可以进行差异备份,这样可以降低备份的容量。

基本名称:tarfile, tarball
tar打包出来的档案有没有进行压缩所得到的档案称呼不同,如果仅时打包而已,就是"tar -cv -f file.tar"而已,这个档案我们称为tarfile。如果还有进行压缩的支援,例如"tar -jcv -f file.tar.bz2"时,我们就称呼为tarball!这是一个基本称谓而已。

tar除了可以将资料打包成为档案之外,还能够将档案打包到某些特别的装置去。比如要将备份资料备份到磁带中
"tar -cv -f /dev/st0 /home /root /etc"磁带用在备份(尤其是企业应用中是很常见的工作!)

特殊应用:利用管线命令与资料流
在tar的使用中,有一种当时最特殊,那就是通过标准输入输出的资料流重导向(standard input/standard output),亦即管线命令的方式,将待处理的档案一边打包一边解压缩到目标目录去。

将/etc整个目录一边打包一边在/tmp 解开
tar_13
这个动作有点像是cp -r /etc/tmp啦~依旧是有其用途的!
要注意的地方在于输出档案变成-而输出档也变成-,又有一个|存在~这分别代表standard output, standard input与管线命令啦!你可以将-想成是在内存中的一个装置(缓冲区)
指令里面的-就是表示那个被打包的档案!由于我们不想要让中间档案存在,所以就以这一个方式来进行复制的行为啦!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注