上一篇文章谈到的命令大多仅能针对单一文件来进行压缩,尽管 gzip 与 bzip2 也能够针对文件夹来进行压缩, 只是。这两个命令对文件夹的压缩指的是『将文件夹内的所有文件 "分别" 进行压缩』的动做!php
而不像在 Windows 的系统。可使用相似 WinRAR 这一类的压缩软件来将好多数据『包成一个文件』的样式。
这样的将多个文件或文件夹包成一个大文件的命令功能,咱们可以称呼他是一种『打包命令』啦! 那 Linux 有没有这样的打包命令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了!linux
tar 可以将多个文件夹或文件打包成一个大文件,同一时候还可以透过 gzip/bzip2 的支持,将该文件同一时候进行压缩! 更有趣的是。由於 tar 的使用太普遍了。眼下 Windows 的 WinRAR 也支持 .tar.gz 档名的解压缩呢。
安全
[root@www ~]# tar [-j|-z] [cv] [-f 建立的档名] filename... <==打包与压缩 [root@www ~]# tar [-j|-z] [tv] [-f 建立的档名] <==察看档名 [root@www ~]# tar [-j|-z] [xv] [-f 建立的档名] [-C 文件夹] <==解压缩 选项与參数: -c :建立打包文件,可搭配 -v 来察看过程当中被打包的档名(filename) -t :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了; -x :解打包或解压缩的功能。可以搭配 -C (大写) 在特定文件夹解开 特别留意的是, -c, -t, -x 不可同一时候出现在一串命令列中。 -j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2 -z :透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz -v :在压缩/解压缩的过程当中,将正在处理的档名显示出来。 -f filename:-f 后面要立马接要被处理的档名!建议 -f 单独写一个选项罗! -C 文件夹 :这个选项用在解压缩,若要在特定文件夹解压缩。可以使用这个选项。 |
事实上最简单的使用 tar 就仅仅要记忆底下的方式就能够:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或文件夹名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的文件夹
session
那个 filename.tar.bz2 是咱们本身取的档名,tar 并不会主动的产生建立的档名喔!咱们要自订啦。 因此扩展名就显的很是重要了。假设不加 [-j|-z] 的话,档名最好取为 *.tar 就能够。假设是 -j 选项,表明有 bzip2 的支持,所以档名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故! 至於假设是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz 。
post
另外,由於『 -f filename 』是紧接在一块儿的。过去很是多文章常会写成『-jcvf filename』。这样是对的, 但由於选项的顺序理论上是可以变换的,因此很是多读者会误以为『-jvfc filename』也可以~其实这样会致使产生的档名变成 c !学习
因为 -fc 嘛!因此罗,建议您在学习 tar 时。将『 -f filename 』与其它选项独立出来。会比較不easy发生故障。
spa
[root@www ~]# tar -jtv -f /root/etc.tar.bz2 ....前面省略.... -rw-r--r-- root/root 1016 2008-05-25 14:06:20 etc/dbus-1/session.conf -rw-r--r-- root/root 153 2007-01-07 19:20:54 etc/esd.conf -rw-r--r-- root/root 255 2007-01-06 21:13:33 etc/crontab |
假设仅仅是想要知道档名而已, 那么就将 -v 拿掉就能够。从上面的数据咱们可以发现一件很是有趣的事情。那就是每个档名都没了根文件夹了!这也是上一个练习中出现的那个警告信息『tar: Removing leading `/' from member names(移除了档名开头的 `/' )』所告知的状况。
那为何要拿掉根文件夹呢?主要是为了安全!咱们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的档名 (就是咱们刚刚使用 tar -jtvf 所察看到的档名) 那就是解压缩后的实际档名。crontab
假设拿掉了根文件夹,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。ip
但『假设没有拿掉根文件夹,解压缩后的档名就会是绝对路径。 亦即解压缩后的数据必定会被放置到 /etc/xxx 去!
』如此一来,你的本来的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了!
范例:将档名中的(根)文件夹也备份下来,并察看一下备份档的内容档名 [root@www ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc ....中间过程省略.... [root@www ~]# tar -jtf /root/etc.and.root.tar.bz2 /etc/dbus-1/session.conf /etc/esd.conf /etc/crontab # 此次查阅档名不含 -v 选项。因此仅有档名而已。没有具体属性/权限等參数。 |
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 [root@www ~]# ll ....(前面省略).... drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc ....(后面省略).... |
只是。这样好像很是麻烦呢~有没有更简单的方法可以『指定欲解开的文件夹』呢? 有的,可以使用 -C 这个选项喔!
举例来讲:
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp [root@www ~]# ll /tmp ....(前面省略).... drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc ....(后面省略).... |
# 1. 先找到咱们要的档名。若是解开 shadow 文件好了: [root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow' -r-------- root/root 1230 2008-09-29 02:21:20 etc/shadow- -r-------- root/root 622 2008-09-29 02:21:20 etc/gshadow- -r-------- root/root 636 2008-09-29 02:21:25 etc/gshadow -r-------- root/root 1257 2008-09-29 02:21:25 etc/shadow <==这是咱们要的! # 先搜寻重要的档名! |
[root@www ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \ > --exclude=/root/system.tar.bz2 /etc /root |
# 1. 先由 find 找出比 /etc/passwd 还要新的文件 [root@www ~]# find /etc -newer /etc/passwd ....(过程省略).... # 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的档名, # 这个结果在每部主机都不一样样! |
另外值得一提的是,tar 打包出来的文件有没有进行压缩所获得文件称呼不一样喔! 假设仅是打包而已。就是『 tar -cv -f file.tar 』而已。这个文件咱们称呼为 tarfile 。 假设还有进行压缩的支持,好比『 tar -jcv -f file.tar.bz2 』时,咱们就称呼为 tarball (tar 球?)! 这仅仅是一个主要的称谓而已。只是很是多书籍与网络都会使用到这个 tarball 的名称!