@1405010304geshuaishuai
2017-07-18T06:19:33.000000Z
字数 3157
阅读 632
Linux
打包
tar
虽然gzip,bzip2,xz也能够针对目录来进行压缩,不过,这两个指令对目录的压缩是指“将目录内的所有文档分别进行压缩”的动作。
tar可以将多个目录或档案打包成一个大档案,同时还可以通过gzip/bzip2/xz的支援,将该文档同时进行压缩。
$ tar [-z|-j|-J][cv][-f 待建立的新档名] filename... //打包与压缩
$ tar [-z|-j|-J][tv][-f 既有的tar档名] //查看档名
$ tar [-z|-j|-J][xv][-f 既有的tar档名] [-C 目录] //解压缩
选项与参数:
-c : 建立打包档案,可搭配-v来查看过程中被打包的档名(filename)
-t : 查看打包档案的内容有哪些档名,重点在查看“档名”就是了
-x : 解打包或解压缩的功能,可以搭配-C(大写)在特定目录解开
特别留意的是,-c,-t,-x不可同时出现在一串指令列中。
-z : 通过gzip的支援进行压缩/解压缩:此时档名最好为*.tar.gz
-j : 通过bzip2的支援进行压缩/解压缩:此时档名最好为*.tar.bz2
-J : 通过xz的支援进行压缩/解压缩:此时档名最好为*.tar.xz
特别留意,-z,-j,-J不可以同时出现在一串指令列中
-v : 在压缩/解压缩的过程中,将正在处理的档名显示出来!
-f filename : -f后面要立刻接要被处理的档名!建议-f单独与一个选项
-C 目录 : 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-p : 保留备份资料的原本的权限属性,常用于备份重要的设定档
-P(大写p) : 保留绝对路径,亦即允许备份资料中含有根目录存在之意
--exclude=FILE : 在压缩的过程中,不要将FILE打包!
*压缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称
*查询:tar -jtv -f filename.tar.bz2
*解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
filename.tar.bz2是我们自己取的档名,tar并不会主动产生建立的档名。
范例:使用tar加入-z,-j或-J的参数备份/etc/目录
由于加上-v这个选项,因此正在作用中的档名就会显示在屏幕上。
显示的信息会跟上面一模一样,不过时间会花比较多!使用了-J时,会花更多时间
至于-p的选项,重点在于“保留原本档案的权限于属性”之意。
由于上面的打包例子中文件太多所以一开始的警告信息并没有看到,所以此处我建立一个test文件来显示警告信息,后面的试验中会用到。
注意此处的警告信息下面会用到。
范例 :查阅tar档案的资料内容(可查看档名),与备份档名有否根目录的意思
加上-v选项,详细的档案权限/属性都会被列出来!如果只是想知道档名而已,那么就将-v拿掉
从上面的资料我们可以发现一件很有趣的事情,那就是每个档名都没了根目录了!这也上上一个test案例中出现的那个警告信息"tar: Removing leading '/' from member names(移除了档名的开头的'/')"所告知的情况!
那为什么要拿掉根目录呢?主要是为了安全!我们使用tar备份的资料可能会需要解压缩回来使用,在tar所记录的档名(就是我们刚刚使用 tar -jtvf所查看到的档名)那就是解压缩后你的真是档名。如果拿掉了根目录,假设你将备份资料在/tmp解开,那么解压缩的档名会变成"/tmp/etc/xxx",如果没有拿掉根目录,解压缩后的档名就会是绝对路径,亦即解压缩后的资料一定会被放置到/etc/xxx去!如此一来,你的原本的/etc/底下的资料,就会被备份资料所覆盖过去!
如果你确定你就是需要备份根目录到tar的档案中,那可以使用-P(大写)这个选项。
范例:将档案名中的(根)目录也备份下来,并查看一下备份档中的内容档名
查看上面压缩的文件内容
# tar -jtf /root/etc.tar.bz2
要想指定欲解开的目录可以使用-C这个选项。
范例:仅解开单一档案的方法
如果我只想解开打包档案内的其中一个档案而已,那该如何做呢?你只要使用-jtv找到你要的档名,然后将该档名解开即可。
1.先找到我们要的档名,假设解开shadow档案:
2.将该档案解开:
范例:打包某目录,但不含该目录下的某些档案之做法
假设我们想要打包/etc/ /root这几个重要的目录,但却不想要打包/root/etc*开头的档案,因为该档案都是刚刚我们才建立的备份文档,而且假设这个新的打包档案要放置成为/root/system.bar.bz2,当然这个档案自己不要打包自己(因为这个档案放置在/root底下啊),此时我们可以通过--exclude的帮忙!那个exclude就是不包含的意思!
通过这个--exclude="file"的动作,我们可以将几个特殊的档案或目录移除在打包之列,让打包的动作变的更加简单。
范例:仅备份比某时刻还要新的档案
--newer-mtime这个选项就很重要,其实有两个选项啦,一个是--newer另一个就是--newer-mtime,这两个选项有何不同?当使用--newer时,表示后续的日期包含mtime与ctime而--newer-mtime则仅是mtime而已。
1.先由find找出比/etc/passwd还要新的档案
(过程省略)
此时会显示出比/etc/passwd这个档案的mtime还要新的档名
2.好了,那么使用tar来进行打包吧!日期为上面看到的2017/06/21
3.显示出档案即可
通过这个指令可以呼出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 解开
这个动作有点像是cp -r /etc/tmp啦~依旧是有其用途的!
要注意的地方在于输出档案变成-而输出档也变成-,又有一个|存在~这分别代表standard output, standard input与管线命令啦!你可以将-想成是在内存中的一个装置(缓冲区)
指令里面的-就是表示那个被打包的档案!由于我们不想要让中间档案存在,所以就以这一个方式来进行复制的行为啦!