第九章、文件与文件系统的压缩与打包 3. 打包命令: tar

打包命令: tar

gzip 与 bzip2 也能够针对目录来进行压缩,
不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』!

将多个文件或目录包成一个大文件的,『打包命令』

tar

[[email protected] ~]# tar [-j|-z] [cv] [-f 创建的档名] filename... <==打包与压缩
[[email protected] ~]# tar [-j|-z] [tv] [-f 创建的档名]             <==察看档名
[[email protected] ~]# 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 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

其他后续练习会使用到的选项介绍:
-p  :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档
-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 并不会主动的产生创建的档名!

由於『 -f filename 』是紧接在一起的,过去很多文章常会写成『-jcvf filename』,这样是对的, 但由於选项的顺序理论上是可以变换的,所以很多读者会误认为『-jvfc filename』也可以,事实上这样会导致产生的档名变成 c ! 因为 -fc !所以建议您在学习 tar 时,将『 -f filename 』与其他选项独立出来,会比较不容易发生问题。


  • 使用 tar 加入 -j 或 -z 的参数备份 /etc/ 目录
[[email protected] ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/‘ from member names  <==注意这个警告信息
/etc/
....中间省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 这个选项,因此正在作用中的档名就会显示在萤幕上。
# 如果你可以翻到第一页,会发现出现上面的错误信息!
# 至於 -p 的选项,重点在於『保留原本文件的权限与属性』之意。

[[email protected] ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 显示的信息会跟上面一模一样!

[[email protected] ~]# ll /root/etc*
-rw-r--r-- 1 root root  8740252 Nov 15 23:07 /root/etc.tar.bz2
-rw-r--r-- 1 root root 13010999 Nov 15 23:01 /root/etc.tar.gz
[[email protected] ~]# du -sm /etc
118     /etc

加上『 -p 』这个选项是为了保存原本文件的权限与属性!


  • 查阅 tar 文件的数据内容(可察看档名),与备份档名有否根目录的意义
[[email protected] ~]# 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 这个选项时,详细的文件权限/属性都会被列出来!如果只是想要知道档名而已, 那么就将 -v 拿掉即可。从上面的数据我们可以发现一件很有趣的事情,那就是每个档名都没了根目录了!这也是上一个练习中出现的那个警告信息『tar: Removing leading `/‘ from member names(移除了档名开头的 `/‘ )』所告知的情况!

那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来使用, 在 tar 所记录的档名 (就是我们刚刚使用 tar -jtvf 所察看到的档名) 那就是解压缩后的实际档名。 如果拿掉了根目录,假设你将备份数据在 /tmp 解开,那么解压缩的档名就会变成『/tmp/etc/xxx』。 但『如果没有拿掉根目录,解压缩后的档名就会是绝对路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!』如此一来,你的原本的 /etc/ 底下的数据, 就会被备份数据所覆盖过去了!

Tips:
你会说:『既然是备份数据,那么还原回来也没有什么问题吧?』想像一个状况,你备份的数据是一年前的旧版 CentOS 4.x,
你只是想要了解一下过去的备份内容究竟有哪些数据而已,结果一解开该文件,却发现你目前新版的 CentOS 5.x 底下的 /etc
被旧版的备份数据覆盖了!此时你该如何是好?所以罗,当然是拿掉根目录比较安全一些的。
 

如果你确定你就是需要备份根目录到 tar 的文件中,那可以使用 -P (大写) 这个选项,请看底下的例子分析:

范例:将档名中的(根)目录也备份下来,并察看一下备份档的内容档名
[[email protected] ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
....中间过程省略....
[[email protected] ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/dbus-1/session.conf
/etc/esd.conf
/etc/crontab
# 这次查阅档名不含 -v 选项,所以仅有档名而已!没有详细属性/权限等参数。

  • 将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)
[[email protected] ~]# tar -jxv -f /root/etc.tar.bz2
[[email protected] ~]# ll
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(后面省略)....

此时该打包文件会在『本目录下进行解压缩』的动作!

[[email protected] ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[[email protected] ~]# ll /tmp
....(前面省略)....
drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
....(后面省略)....

这样一来,你就能够将该文件在不同的目录解开罗!鸟哥个人是认为,这个 -C 的选项务必要记忆一下的! 好了,处理完毕后,请记得将这两个目录删除一下呢!

[[email protected] ~]# rm -rf /root/etc /tmp/etc

再次强调,这个『 rm -rf 』是很危险的命令!下达时请务必要确认一下后面接的档名。我们要删除的是 /root/etc 与 /tmp/etc, 您可不要将 /etc/ 删除掉了!系统会死掉的~ ^_^


  • 仅解开单一文件的方法

刚刚上头我们解压缩都是将整个打包文件的内容全部解开!想像一个情况,如果我只想要解开打包文件内的其中一个文件而已,
那该如何做呢?很简单的,你只要使用 -jtv 找到你要的档名,然后将该档名解开即可。
我们用底下的例子来说明一下:

# 1. 先找到我们要的档名,假设解开 shadow 文件好了:
[[email protected] ~]# 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  <==这是我们要的!
# 先搜寻重要的档名!其中那个 grep 是『撷取』关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键字的意思!

# 2. 将该文件解开!语法与实际作法如下:
[[email protected] ~]# tar -jxv -f 打包档.tar.bz2 待解开档名
[[email protected] ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[[email protected] ~]# ll etc
total 8
-r-------- 1 root root 1257 Sep 29 02:21 shadow  <==呦喝!只有一个文件啦!
# 很有趣!此时只会解开一个文件而已!不过,重点是那个档名!你要找到正确的档名。
# 在本例中,你不能写成 /etc/shadow !因为记录在 etc.tar.bz2 内的档名之故!

  • 打包某目录,但不含该目录下的某些文件之作法

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

[[email protected] ~]# tar -jcv  -f /root/system.tar.bz2 --exclude=/root/etc* > --exclude=/root/system.tar.bz2  /etc /root

上面的命令是一整列的~其实你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要两行输入时,最后面加上反斜线 (\) 并立刻按下 [enter] , 就能够到第二行继续输入了。这个命令下达的方式我们会在第三章再仔细说明。 透过这个 --exclude="file" 的动作,我们可以将几个特殊的文件或目录移除在打包之列, 让打包的动作变的更简便喔!^_^

另外,在新版的 tar 命令中,鸟哥发现原本的『 --exclude file 』似乎无法实际运行了!使用 man tar 明明有看到这个选项的说, 但使用 info tar 才发现,选项功能已经变成了『 --exclude=file 』的模式!这个地方得要特别留意呢!


  • 仅备份比某个时刻还要新的文件

某些情况下你会想要备份新的文件而已,并不想要备份旧文件!此时 --newer-mtime 这个选项就粉重要啦!
其实有两个选项啦,一个是『 --newer 』另一个就是『 --newer-mtime 』,这两个选项有何不同呢?
我们在 第七章的 touch介绍中谈到过三种不同的时间参数,
当使用 --newer 时,表示后续的日期包含『 mtime 与 ctime 』,而 --newer-mtime 则仅是 mtime 而已!
这样知道了吧! ^_^ 。那就让我们来尝试处理一下罗!

# 1. 先由 find 找出比 /etc/passwd 还要新的文件
[[email protected] ~]# find /etc -newer /etc/passwd
....(过程省略)....
# 此时会显示出比 /etc/passwd 这个文件的 mtime 还要新的档名,
# 这个结果在每部主机都不相同!您先自行查阅自己的主机即可,不会跟鸟哥一样!

[[email protected] ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd

# 2. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2008/09/29
[[email protected] ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 > --newer-mtime="2008/09/29" /etc/*
....(中间省略)....
/etc/smartd.conf    <==真的有备份的文件
....(中间省略)....
/etc/yum.repos.d/   <==目录都会被记录下来!
tar: /etc/yum.repos.d/CentOS-Base.repo: file is unchanged; not dumped
# 最后行显示的是『没有被备份的』,亦即 not dumped 的意思!

# 3. 显示出文件即可
[[email protected] ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | > grep -v ‘/$‘
# 透过这个命令可以呼叫出 tar.bz2 内的结尾非 / 的档名!就是我们要的啦!

现在你知道这个命令的好用了吧!甚至可以进行差异文件的记录与备份呢~ 这样子的备份就会显的更容易罗!你可以这样想像,如果我在一个月前才进行过一次完整的数据备份, 那么这个月想要备份时,当然可以仅备份上个月进行备份的那个时间点之后的升级的文件即可! 为什么呢?因为原本的文件已经有备份了嘛!干嘛还要进行一次?只要备份新数据即可。这样可以降低备份的容量啊!


  • 基本名称: tarfile, tarball ?

另外值得一提的是,tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔!
如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。
如果还有进行压缩的支持,例如『 tar -jcv -f file.tar.bz2 』时,我们就称呼为
tarball (tar 球?)!
这只是一个基本的称谓而已,不过很多书籍与网络都会使用到这个 tarball 的名称!
所以得要跟您介绍介绍。

此外,tar 除了可以将数据打包成为文件之外,还能够将文件打包到某些特别的装置去,举例来说,
磁带机 (tape) 就是一个常见的例子。磁带机由於是一次性读取/写入的装置,因此我们不能够使用类似 cp 等命令来复制的!
那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:『tar -cv -f /dev/st0 /home /root /etc』,很简单容易吧!
磁带机用在备份 (尤其是企业应用) 是很常见的工作喔!


  • 特殊应用:利用管线命令与数据流

在 tar 的使用中,有一种方式最特殊,那就是透过标准输入输出的数据流重导向(standard input/standard output),
以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。
关於数据流重导向与管线命令更详细的数据我们会在第十一章 bash 再跟大家介绍,
底下先来看一个例子吧!

# 1. 将 /etc 整个目录一边打包一边在 /tmp 解开
[[email protected] ~]# cd /tmp
[[email protected] tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 简单的想法中,你可以将 - 想成是在内存中的一个装置(缓冲区)。
# 更详细的数据流与管线命令,请翻到 bash 章节罗!

在上面的例子中,我们想要『将 /etc 底下的数据直接 copy 到目前所在的路径,也就是 /tmp 底下』,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,其中,命令里面的 - 就是表示那个被打包的文件啦! 由於我们不想要让中间文件存在,所以就以这一个方式来进行复制的行为啦!


  • 例题:系统备份范例

系统上有非常多的重要目录需要进行备份,而且其实我们也不建议你将备份数据放置到 /root 目录下!
假设目前你已经知道重要的目录有底下这几个:

  • /etc/ (配置档)
  • /home/ (使用者的家目录)
  • /var/spool/mail/ (系统中,所有帐号的邮件信箱)
  • /var/spool/cron/ (所有帐号的工作排成配置档)
  • /root (系统管理员的家目录)

然后我们也知道,由於第八章曾经做过的练习的关系, /home/loop*
不需要备份,而且 /root 底下的压缩档也不需要备份,另外假设你要将备份的数据放置到
/backups ,并且该目录仅有 root 有权限进入!
此外,每次备份的档名都希望不相同,例如使用:backup-system-20091130.tar.bz2 之类的档名来处理。
那你该如何处理这个备份数据呢?(请先动手作看看,再来察看一下底下的参考解答!)

# 1. 先处理要放置备份数据的目录与权限:
[[email protected] ~]# mkdir /backups
[[email protected] ~]# chmod 700 /backups
[[email protected] ~]# ll -d /backups
drwx------ 2 root root 4096 Nov 30 16:35 /backups

# 2. 假设今天是 2009/11/30 ,则创建备份的方式如下:
[[email protected] ~]# tar -jcv -f /backups/backup-system-20091130.tar.bz2 > --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* > /etc /home /var/spool/mail /var/spool/cron /root
....(过程省略)....

[[email protected] ~]# ll -h /backups/
-rw-r--r-- 1 root root 8.4M Nov 30 16:43 backup-system-20091130.tar.bz2


第九章、文件与文件系统的压缩与打包 3. 打包命令: tar

时间: 2024-10-01 07:06:55

第九章、文件与文件系统的压缩与打包 3. 打包命令: tar的相关文章

鸟哥的Linux私房菜_基础版_学习笔记5:第九章 文件与文件系统的压缩与打包

9.2 Linux 系统常见的压缩命令: *.Z compress 程序压缩的文件: *.gz gzip 程序压缩的文件: *.bz2 bzip2 程序压缩的文件: *.tar tar 程序打包的数据,并没有压缩过: *.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩 *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩 9.2.1 compress  [[email protected] ~]# apt-get install ncompress

第9章 文件与文件系统的压缩与打包

压缩文件的用途与技术 例如,计算机都是以byte单位来计量的,1byte占8bit.如果存储数字1,那么1byte就会空出7bit.采用一定的计算方式,压缩这些空间可以大大降低文件存储. Linux系统常见的压缩命令 Linux下压缩文件的扩展名有*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 扩展名用来说明压缩所采用的指令类型 *.Z compress程序压缩的文件 *.gz gzip程序压缩的文件 *.bz2 bzip2程序压缩的文件 *.tar tar打包

Linux文件与文件系统的压缩与打包

Linux文件与文件系统的压缩与打包 进来在学习Linux了,不过Linux的命令太多了,怕记不住所以使用博客记录的方式来写下自己的学习过程,以后忘记了还可以翻阅自己写下的博客来查查: Linux系统常见的压缩命令 Compress gzip,gcat bzip2,bzcat 打包命令:tar Linux系统常见的压缩命令 Linux的环境下,压缩文件大多扩展名是*.tar, *.tar,*.gz, *.tgz, *.gz, *.Z, *.bz2,下面我们列出常见的压缩文件扩展名: *.Z---

指令篇:文件与文件系统的压缩与解压与打包(归档)与解压___gzip、zcat;bzip2、bzcat;zip; tar

一.文件与文件系统的压缩: 1.单文件的四种压缩命令: ①.Compress (过时了,不做过多说明) ②.gzip,zcat  (gzip:压缩.zcat:查看) ③.bzip2,bzcat (bzip:压缩.bzcat:查看) ④.zip (zip:压缩.unzip:解压) 2.gzip,zcat 组合. 不保留源文件压缩:gzip file 保留源文件压缩:gzip -c file > file.gz 查看压缩比例并压缩文件:gzip -v file 查看压缩文件里面的内容:zcat fi

第九章、文件与文件系统的压缩与打包

1. 压缩文件的用途与技术 2. Linux 系统常见的压缩命令 2.1 compress 2.2 gzip, zcat 2.3 bzip2, bzcat 3. 打包命令: tar 4. 完整备份工具:dump, restore 5. 光盘写入工具 5.1 mkisofs:创建映像档 5.2 cdrecord:光盘烧录工具 6. 其他常见的压缩与备份工具 6.1 dd 6.2 cpio 7. 重点回顾 1. 压缩文件的用途与技术 2. Linux 系统常见的压缩命令 压缩文件的扩展名大多是:『*

第九章、文件与文件系统的压缩与打包 Linux 系统常见的压缩命令

Linux 系统常见的压缩命令: 在Linux中,压缩文件的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』 Linux 支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,彼此之间可能就无法相互压缩/解压缩文件. 所以,当你下载到某个压缩档时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照著解压缩!虽然 Linux 文件的属性基本上是与档名没有绝对关系的, 但是为了帮助我们人类,所以适当的扩展名还是必要的! *.Z comp

鸟哥linux——文件与文件系统的压缩,打包和备份

先说明一下压缩技术: 由于我们记录1,在字节中占据的是最右边的1,而其他7位为0.而工程师们利用复杂的算法,将这些7个0位"丢"出来换成了更有用的信息去占领.这就是压缩技术了. 另一种压缩技术是消除连续重复的数据,比如你有一个111...这样100个1,这种压缩直接把它表示为100个1这样的表示方法,而不是真的在内存中存在100个1的字节. linux系统常用的压缩指令: 注意:linux的扩展名通常是没有什么用的.但是,一般压缩文件是需要扩展名的. 为什么linux的压缩文件需要扩展

linux——(5)文件与文件系统的压缩与打包

概念一:常见的压缩文件拓展名 .z compress程序压缩的文件. .gz gzip程序压缩的文件. .bz2 bzip2程序压缩的文件. .tar tar程序打包的数据,并没有压缩过. .tar.gz tar程序打包的数据,gzip程序压缩的文件. .tar.bz2 tar程序打包的数据,bzip2程序压缩的文件. 概念二:打包和压缩的区别:linux里的压缩命令大多都是针对一个文件的若是有一堆文件需要压缩,就要一个一个压,这样太麻烦了,所以linux上还有一个打包命令可以把一堆文件打包成一

关于文件与文件系统的压缩与打包命令-Linux(笔记)

1.gzip : 压缩命令 gzip [-cdtv#] 文件名称 (后缀为.gz) -c :将压缩的数据输出到屏幕上,可通过数据流重定向处理 -d : 解压缩的參数 -v : 能够显示源文件/压缩文件的压缩比等信息 -# :压缩等级.-1最快,-9最慢,默认-6 2.zcat : 读取压缩文件 zcat 文件名称.gz 3.bzip2 :压缩命令 bzip2 [-cdkzv#] 文件名称 (后缀为.bz2) 4.bzcat : 读取压缩文件 bzcat 文件名称.bz2 5.tar : 打包命令