`

第九章 打包命令: tar

 
阅读更多
前一小节谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 "分别" 进行压缩』的动作! 而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据『包成一个文件』的样式。

这种将多个文件或目录包成一个大文件的命令功能,我们可以称呼他是一种『打包命令』啦! 那 Linux 有没有这种打包命令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了! tar 可以将多个目录或文件打包成一个大文件,同时还可以透过 gzip/bzip2 的支持,将该文件同时进行压缩! 更有趣的是,由於 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 档名的解压缩呢! 很不错吧!所以底下我们就来玩一玩这个咚咚!

tar

tar 的选项与参数非常的多!我们只讲几个常用的选项,更多选项您可以自行 man tar 查询罗!

[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 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

其他后续练习会使用到的选项介绍:
-p  :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档
-P  :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包! 


其实最简单的使用 tar 就只要记忆底下的方式即可:

A 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
B 查 询:tar -jtv -f filename.tar.bz2
C 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主动的产生创建的档名喔!我们要自订啦! 所以扩展名就显的很重要了!如果不加 [-j|-z] 的话,档名最好取为 *.tar 即可。如果是 -j 选项,代表有 bzip2 的支持,因此档名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故! 至於如果是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz 喔!了解乎?

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

闲话少说,让我们来测试几个常用的 tar 方法吧!

使用 tar 加入 -j 或 -z 的参数备份 /etc/ 目录

有事没事备份一下 /etc 这个目录是件好事!备份 /etc 最简单的方法就是使用 tar 罗!让我们来玩玩先:

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

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

[root@www ~]# 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
[root@www ~]# du -sm /etc
118     /etc
# 为什么建议您使用 -j 这个选项?从上面的数值你可以知道了吧?^_^


由上述的练习,我们知道使用 bzip2 亦即 -j 这个选项来制作备份时,能够得到比较好的压缩比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至於加上『 -p 』这个选项的原因是为了保存原本文件的权限与属性!我们曾在第七章的 cp 命令介绍时谈到权限与文件类型(例如连结档)对复制的不同影响。 同样的,在备份重要的系统数据时,这些原本文件的权限需要做完整的备份比较好。此时 -p 这个选项就派的上用场了。 接下来让我们看看打包文件内有什么数据存在?

查阅 tar 文件的数据内容(可察看档名),与备份档名有否根目录的意义

要察看档名非常的简单!可以这样做:

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

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

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

范例:将档名中的(根)目录也备份下来,并察看一下备份档的内容档名
[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 选项,所以仅有档名而已!没有详细属性/权限等参数。


有发现不同点了吧?如果加上 -P 选项,那么档名内的根目录就会存在喔!不过,鸟哥个人建议,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中! 所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全呢!

将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

那如果想要解打包呢?很简单的动作就是直接进行解打包嘛!

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


此时该打包文件会在『本目录下进行解压缩』的动作! 所以,你等一下就会在家目录底下发现一个名为 etc 的目录罗!所以罗,如果你想要将该文件在 /tmp 底下解开, 可以 cd /tmp 后,再下达上述的命令即可。不过,这样好像很麻烦呢~有没有更简单的方法可以『指定欲解开的目录』呢? 有的,可以使用 -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
....(后面省略)....



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

[root@www ~]# rm -rf /root/etc /tmp/etc


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

仅解开单一文件的方法

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

# 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  <==这是我们要的!
# 先搜寻重要的档名!其中那个 grep 是『撷取』关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 | 配合 grep 可以撷取关键字的意思!

# 2. 将该文件解开!语法与实际作法如下:
[root@www ~]# tar -jxv -f 打包档.tar.bz2 待解开档名
[root@www ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@www ~]# 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 就是不包含的意思!所以你可以这样做:

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

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

# 2. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2008/09/29
[root@www ~]# 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. 显示出文件即可
[root@www ~]# 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』,很简单容易吧! 磁带机用在备份 (尤其是企业应用) 是很常见的工作喔!

例题:系统备份范例

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

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

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

# 2. 假设今天是 2009/11/30 ,则创建备份的方式如下:
[root@www ~]# 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
....(过程省略)....

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



转自:http://vbird.dic.ksu.edu.tw/linux_basic/0240tarcompress_3.php
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Linux 常用命令 Linux 常用命令

    xargs 命令可以将所有图片文件拷贝到外部驱动器、将系统中所有 jpd 文件压缩打包、下载文件中列出的所有 url 对应的页面等。 例如,将所有图片文件拷贝到外部驱动器:`ls *.jpg | xargs -n1 -i cp {} /external-...

    我的Linux实验——第9章(文件与文件系统的压缩和打包)

    文章目录第9章(文件与文件系统的压缩和打包)1. Linux系统常见的压缩命令1.1 Compress1.1.1 压缩1.1.2 解压缩1.1.3 保留原文件压缩1.2 gzip,zcat1.2.1 压缩1.2.2 解压缩1.2.3 保留原文件压缩1.2.4 不解压缩查看...

    linux常用命令大全.pdf

    24. `tar` 命令:打包和解包文件或目录。`tar -cvf archive.tar file1 file2` 打包 `file1` 和 `file2` 到 `archive.tar`。 25. `gzip` 命令:压缩文件以节省存储空间。`gzip file1` 压缩 `file1`。 26. `unzip` ...

    tar压缩和解压缩

    - 此命令使用管道`|`连接两个`tar`命令,第一个命令将`/etc`目录打包,第二个命令将打包后的数据解压到当前目录。 #### 五、总结 `tar`命令在Linux系统管理中扮演着至关重要的角色,它提供了丰富的选项和功能,使得...

    Linux 打包解包

    **打包命令**: ```bash tar cvf FileName.tar DirName ``` - `c`:创建新的归档文件。 - `v`:详细模式输出。 - `f`:指定归档文件名。 - `FileName.tar`:生成的归档文件名。 - `DirName`:要打包的目录名。 **...

    第五章 Linux命令和技巧

    在IT领域,Linux操作系统是开发者、系统管理员以及技术爱好者们常用的一个工具,其强大的命令行界面提供了高效的工作...通过阅读"第五章 Linux命令和技巧.txt",你可以获得更详细的信息和实例,加深对这些概念的理解。

    Linux常用命令.doc

    `tar`命令用于打包和压缩文件,如`tar -czvf archive.tar.gz file1 file2`将file1和file2打包并压缩为archive.tar.gz。`gzip`和`bzip2`用于压缩单个文件。 六、帮助相关命令 `man`命令提供命令的手册页,如`man ls`...

    专高2_练习手册_高性能架构_第04单元2

    9. `tar`和打包工具:`tar`通常用于打包文件或目录,而`rpm`、`bin`、`dpkg`等工具则用于打包和管理可执行程序及依赖。 10. Linux进程管理:`kill`命令用于结束后台进程,`Ctrl+C`通常用于终止前台进程。 11. 源码...

    Linux命令从入门到精通二十一到三十章

    第二十九章:用户与用户组管理 理解用户和用户组的概念,以及如何使用`useradd`、`userdel`、`groupadd`、`groupdel`、`usermod`和`groupmod`命令来管理它们,是系统管理员的基本技能。 第三十章:计划任务与自动化...

    linux维护常用命令

    假设我们需要将 `/home/user/documents` 目录打包成一个名为 `documents.tar` 的文件,则命令为: ```bash tar -cvf documents.tar /home/user/documents/ ``` **1.2 解压 tar 后缀名的软件包** **命令格式**: ``...

    UNIX教程网络篇(打包)

    第9章 TCP/IP网络互联技术 129 9.1 TCP/IP协议 129 9.2 域名 130 9.3 Internet和Intranet 131 9.4 TCP/IP地址 132 9.5 TCP/IP网络地址 133 9.6 TCP/IP 配置文件 134 9.6.1 标识主机名文件:/etc/hosts 134 9.6.2 ...

    SSH命令大全及用法

    16. `tar cfz geek.tar.gz tool`:将tool目录打包并压缩为geek.tar.gz文件。 17. `wget http://www.sevenapart.com/download/wp.tar.gz`:从指定URL下载wp.tar.gz文件。 18. `wget -c ...

    centos7.tar.gz

    在Linux系统中,".tar.gz"是一种常见的文件打包格式,它结合了tar(用于打包多个文件)和gzip(用于压缩文件)的功能,可以有效地减小文件体积,便于存储和传输。解压该文件通常需要使用`tar`命令,如`tar -zxvf ...

    Git User’s Manual

    - 示例命令:`git archive --format=tar --output &lt;archive-name&gt;.tar &lt;commit-id&gt;` - **查找包含特定文件内容的提交**:使用`git log`和`grep`。 - 示例命令:`git log -S "&lt;search-text&gt;"` --- #### 三、使用Git...

    Linux命令从入门到精通十一到二十章

    本教程涵盖了Linux命令从入门到精通的第十一至第二十章,旨在帮助用户深入了解并熟练运用这些基础及进阶的命令。以下将详细介绍这些章节涵盖的知识点。 第十一章:文件与目录操作 在这一章,学习者会了解到Linux...

    第9章-文件的归档和压缩1

    第九章主要讲解了文件的归档和压缩技术,这对于管理和传输大量数据至关重要。在Linux操作系统中,常用的工具有tar、zip以及gzip、bzip2、xz等压缩工具。 首先,我们来看tar命令,它主要用于文件的归档和压缩。归档...

    05文件打包与解压缩.pdf

    打包后产生的文件通常以.tar结尾,如果文件已经经过压缩,则会添加相应的后缀,如.tar.gz、.tar.xz 或 .tar.bz2。 接下来,我们将详细讨论zip、rar和tar命令的使用。 1. zip命令 zip是一个压缩工具,它可以创建...

    tree-1.5.3.tar.gztree-1.5.3.tar.gz

    1. **tar命令**:首先,".tar" 扩展名表示这是一个归档文件,由“tar”命令创建,用于将多个文件和目录打包成一个单一的文件。"tar" 是 "tape archive" 的缩写,虽然最初设计是为磁带备份,但现在广泛用于各种存储...

    linux基础培训胶片

    - `tar`命令结合压缩工具,可以打包和压缩多个文件或目录。 6. **X Window System**: - X Window System是Linux图形界面的基础,提供了窗口管理器和桌面环境如Gnome、KDE等。 - `startx`命令通常用于启动X ...

Global site tag (gtag.js) - Google Analytics