文档章节

Linux学习-打包指令 : tar

u
 uetucci
发布于 2017/08/28 10:15
字数 3348
阅读 20
收藏 0
点赞 0
评论 0

tar

tar 的选项与参数非常的多!我们只讲几个常用的选项。

[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... <==打包与压缩 
[dmtsai@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar文件名]   <==查看  
[dmtsai@study ~]$ 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(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!

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

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

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

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

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

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

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

[dmtsai@study ~]$ su - # 因为备份 /etc 需要 root 的权限,否则会出现一堆错误
[root@study ~]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names <==注意这个警告讯息
/etc/
....(中间省略)....
/etc/hostname
/etc/aliases.db

real 0m0.799s # 多了 time 会显示程序运行的时间!看 real 就好了!花去了 0.799s
user    0m0.767s
sys 0m0.046s
# 由于加上 -v 这个选项,因此正在作用中的文件名就会显示在屏幕上。
# 如果你可以翻到第一页,会发现出现上面的错误讯息!下面会讲解。
# 至于 -p 的选项,重点在于“保留原本文件的权限与属性”之意。

[root@study ~]# time tar -jpcv -f /root/etc.tar.bz2 /etc
....(前面省略)....
real    0m1.913s
user    0m1.881s
sys 0m0.038s
[root@study ~]# time tar -Jpcv -f /root/etc.tar.xz  /etc
....(前面省略)....
real    0m9.023s
user    0m8.984s
sys 0m0.086s
# 显示的讯息会跟上面一模一样 !不过时间会花比较多!使用了 -J 时,会花更多时间

[root@study ~]# ll /root/etc*
-rw-r--r--. 1 root root 6721809 Jul  1 00:16 /root/etc.tar.bz2
-rw-r--r--. 1 root root 7758826 Jul  1 00:14 /root/etc.tar.gz
-rw-r--r--. 1 root root 5511500 Jul  1 00:16 /root/etc.tar.xz
[root@study ~]# du -sm /etc
28 /etc # 实际目录约占有 28MB 的意思!
  • 查阅 tar 文件的数据内容 (可察看文件名),与备份文件名有否根目录的意义

要察看由 tar 所创建的打包文件内部的文件名非常的简单!可以这样做:

[root@study ~]# tar -jtv -f /root/etc.tar.bz2
....(前面省略)....
-rw-r--r-- root/root       131 2015-05-25 17:48 etc/locale.conf
-rw-r--r-- root/root        19 2015-05-04 17:56 etc/hostname
-rw-r--r-- root/root     12288 2015-05-04 17:59 etc/aliases.db

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

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

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

范例:将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
[root@study ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc

[root@study ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/locale.conf
/etc/hostname
/etc/aliases.db
# 这次查阅文件名不含 -v 选项,所以仅有文件名而已!没有详细属性/权限等参数。
  • 将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

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

[root@study ~]# tar -jxv -f /root/etc.tar.bz2
[root@study ~]# ll
....(前面省略)....
drwxr-xr-x. 131 root root    8192 Jun 26 22:14 etc
....(后面省略)....

此时该打包文件会在“本目录下进行解压缩”的动作! 所以,你等一下就会在主文件夹下面发 现一个名为 etc 的目录。如果你想要将该文件在 /tmp 下面解开, 可以 cd /tmp 后,再下达上述的指令即可。不过,这样好像很麻烦呢~有没有更简单的方法可以“指定欲解 开的目录”呢? 有的,可以使用 -C 这个选项喔!举例来说:

[root@study ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@study ~]# ll /tmp
....(前面省略)....
drwxr-xr-x. 131 root   root     8192 Jun 26 22:14 etc
....(后面省略)....
  • 仅解开单一文件的方法

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

 #1. 先找到我们要的文件名,假设解开 shadow 文件好了:
 [root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root       721 2015-06-17 00:20 etc/gshadow
---------- root/root      1183 2015-06-17 00:20 etc/shadow-
---------- root/root 1210 2015-06-17 00:20 etc/shadow &lt;==这是我们要的!
---------- root/root       707 2015-06-17 00:20 etc/gshadow-
# 先搜寻重要的文件名!其中那个 grep 是“撷取”关键字的功能!我们会在第三篇说明!
# 这里您先有个概念即可!那个管线 &#124; 配合 grep 可以撷取关键字的意思!

# 2. 将该文件解开!语法与实际作法如下:
 [root@study ~]# tar -jxv -f 打包档.tar.bz2 待解开文件名
 [root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
 etc/shadow
 [root@study ~]# ll etc
 total 4
 ----------. 1 root root 1210 Jun 17 00:20 shadow
 # 很有趣!此时只会解开一个文件而已!不过,重点是那个文件名!你要找到正确的文件名。
 # 在本例中,你不能写成 /etc/shadow !因为记录在 etc.tar.bz2 内的并没有 / 之故!
  • 打包某目录,但不含该目录下的某些文件之作法

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

[root@study ~]# 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" 的动作,我们可以将几个特殊的文件或 目录移除在打包之列,让打包的动作变的更简便喔。

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

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

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

[root@study ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2092  Jun 17 00:20 /etc/passwd

# 2\. 好了,那么使用 tar 来进行打包吧!日期为上面看到的 2015/06/17
[root@study ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2015/06/17" /etc/*
tar: Option --newer-mtime: Treating date `2015/06/17' as 2015-06-17 00:00:00
tar: Removing leading `/' from member names
/etc/abrt/
....(中间省略)....
/etc/alsa/
/etc/yum.repos.d/
....(中间省略)....
tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped
# 最后行显示的是“没有被备份的”,亦即 not dumped 的意思!

# 3. 显示出文件即可
[root@study ~]# 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球?)。

此外,tar 除了可以将数据打包成为文件之外,还能够将文件打包到某些特别的设备去,举例 来说, 磁带机 (tape) 就是一个常见的例子。磁带机由于是一次性读取/写入的设备,因此 我们不能够使用类似 cp 等指令来复制的! 那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:“tar -cv -f /dev/st0 /home /root /etc”。

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

在 tar 的使用中,有一种方式最特殊,那就是通过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解 压缩到目标目录去。

# 1. 将 /etc 整个目录一边打包一边在 /tmp 解开
[root@study ~]# cd /tmp
 [root@study tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在于输出文件变成 - 而输入文件也变成 - ,又有一个 |存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 简单的想法中,你可以将 - 想成是在内存中的一个设备(缓冲区)。 !

© 著作权归作者所有

共有 人打赏支持
u
粉丝 0
博文 53
码字总数 103136
作品 0
深圳
程序员
Linux下文件的打包、解压缩指令——tar,gzip,bzip2

Linux下文件的打包、解压缩指令——tar,gzip,bzip2   本文是对 鸟叔的Linux私房菜(基础学习篇) 第三版 的学习笔记,原文可参考原书中文网站 鸟叔的Linux私房菜。更多详细信息可直接参考对...

xiaocao13140 ⋅ 05/28 ⋅ 0

shell学习摘抄

1、type指令查看命令的来源:bash内建,alias别名,其他文件。还可以查看命令的文件地址 2、一长串指令中。需由其他指令提供指令提供信息,可以使用反单引号或者$()来运行 如version=$(uname...

iamyangjy ⋅ 2014/06/10 ⋅ 1

Linux下常用压缩 解压命令和压缩比率对比

Linux下常用压缩 解压命令和压缩比率对比 常用的格式有: tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大。 1. tar 只是打包动作,相当于归档处理...

xiaocao13140 ⋅ 06/06 ⋅ 0

Linux学习笔记(文件打包与解压缩)

常用命令: zip: 打包 :zip something.zip something (目录请加 -r 参数) 解包:unzip something 指定路径:-d 参数 tar: 打包:tar -zcvf something.tar something 解包:tar -zxvf s...

techservice ⋅ 2017/09/06 ⋅ 0

zip、tar工具的介绍及用法

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具 直接压缩 格式 zip 1.txt.zip 1.txt //可以看到zip需要先命名文件 [root@centos7 tmp]# ls -lh 1.txt 查看文件大小-rw-r--r--....

WiFi362227 ⋅ 2017/11/11 ⋅ 0

tar ------ linux解压 tar命令

tar命令 tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参...

yangcoder ⋅ 2012/10/02 ⋅ 0

linux解压 tar命令

tar命令 tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参...

DD2086 ⋅ 2011/05/13 ⋅ 0

linux解压(一) tar命令

tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参数的下达...

vfan140 ⋅ 2012/04/18 ⋅ 0

linux解压tar命令

tar命令 tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参...

lintur ⋅ 2009/09/22 ⋅ 0

linux tar命令

tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参数的下达...

神勇小白鼠 ⋅ 2011/04/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 32分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 50分钟前 ⋅ 0

001. 深入JVM学习—Java运行流程

1. Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存...

影狼 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部