tar命令基本、进阶使用指北

摘要

打包与压缩是我们在计算机系统日常使用中必备的一个工具,就如我们在使用Windows系统,也需要类似WinRAR的压缩软件来将许多数据、文件打包成一个文件,并压缩其占用空间。我们在Linux下也需要这样的工具,Linux下有类似gzip、bzip2之类的压缩工具,不过,这两个命令对目录的压缩指的是将目录内的所有文件“分别”进行压缩。

那Linux下有没有类似WinRAR一样强大的打包工具呢?那就是大名鼎鼎的tar了。tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip/bzip2的支持,将该文件同时进行压缩。更有趣的是,由于tar的使用太广泛了,以致于目前WinRAR也支持tar.gz文件名的解压缩。本文我将介绍tar命令的语法构成、参数说明、具体使用以及进阶操作。

一、语法构成与参数说明

1. tar语法构成

tar的参数非常多,这里只讲几个常用参数,更多参数可通过man tar查询。

[root@centos7-master ~]# tar [-j|-z] [cv] [-f 新建的文件名] filename... <==打包与压缩
[root@centos7-master ~]# tar [-j|-z] [tv] [-f 新建的文件名] <==查看文件名
[root@centos7-master ~]# tar [-j|-z] [xv] [-f 新建的文件名] [-C 指定目录] <==解压缩

2. tar参数说明

-j:通过bzip2的支持进行压缩/解压缩,此时文件名最好为*.tar.bz2,这种压缩方式效果比gzip压缩效果更好(压缩后的文件更小)
-z:通过gzip的支持进行压缩/解压缩,此时文件名最好为*.tar.gz -c:新建打包文件,可搭配 -v 来查看过程中被打包的文件名(filename)
-t:查看打包文件的内容含有哪些文件名,重点在查看文件名。
-x:解打包或解压缩的功能,可以搭配 -C(大写)在特定目录解开。 特别留意:-c、-t、-x 不可同时出现在一串命令行中。 -v:在压缩/解压缩的过程中,将正在处理的文件名显示出来 -f filename:-f 后面要接被处理的文件名,建议 -f 单独写一个参数 -C 指定目录:这个参数用在解压缩时,若要在特定目录解压缩,可以使用这个参数 -p:保留备份数据原本权限与属性,常用于备份(-c)重要的配置文件
-P:保留绝对路径,即允许备份数据中包含有根目录/
-exclude=FILE: 在压缩过程中,排除FILE,不要将FILE打包

3. tarfile与tarball的区别

我们知道tar是一个打包&压缩命令,它支持仅打包而不压缩,也支持即打包又压缩。

如果仅打包,就是tar -cv -f file.tar而已,这个文件我们称为tarfile

如果即打包又压缩,就是tar -jcv -f file.tar.bz2而已,这个文件我们称为tarball

二、tar的具体使用

tar最常用的三个命令形式如下:

打包:tar -cv -f filename.tar filename
压缩:tar -jcv -f filename.tar.bz2 filename
tar -zcv -f filename.tar.gz filename
查询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 指定解压缩目录

这里说明一下,-f filename是紧接在一起的,但很多文章会写成-jcvf filename,这样也是对的。但由于参数的顺序理论上可调整,有些同学会写成-jvfc filename,其实也可以运行,但是会导致产生的文件名变为x,因为f后面紧跟的是c,系统会将f后面的内容识别为文件名。

所以建议还是把-f filename与其他参数独立开来写,可以避免不必要的问题出现。

但经过在Centos7上的实验,若参数f不写在最后(filename前面),会无法执行,说明Centos7对tar命令做了优化处理,具体如下:

[root@centos7-master ~]# tar -jvfc test_tar.tar.bz2 ./test_tar
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.

三、tar进阶

1. -p 参数:保留文件的权限与属性信息,且去掉根目录进行打包&压缩

使用tar -p保留备份数据的原本权限与属性。下面以备份etc目录为例:

[root@centos7-master ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
tar: Removing leading `/' from member names <==注意这个警告消息
# -p参数会保留原文本文件的权限与属性

我们查阅一下刚刚备份的etc目录长什么样。

[root@centos7-master ~]# tar -jtv -f /root/etc.tar.bz2
...前面省略...
-rw-r--r-- root/root 2000 2019-08-06 21:44 etc/ntp.conf
drwxr-xr-x root/root 0 2020-05-01 20:25 etc/smartmontools/
-rw-r--r-- root/root 6774 2020-04-01 12:32 etc/smartmontools/smartd.conf
drwxr-xr-x root/root 0 2020-04-01 12:32 etc/smartmontools/smartd_warning.d/
-rwxr-xr-x root/root 5586 2020-04-01 12:32 etc/smartmontools/smartd_warning.sh

我们发现一个有趣的事情,那就是每个文件名都没了根目录。这也是上面我们在打包etc目录时遇到的那个警告消息tar: Removing leading `/' from member names(删除了文件名开头的`/')所告知的情况。

那为什么要去掉根目录呢?

主要是为了安全。我们知道,使用tar备份的数据可能会需要解压缩回来使用,tar -jtvf命令所查看到的文件名就是解压缩后的实际文件名。

设想一下,如果没有去掉根目录,解压缩后的文件名就会是绝对路径,即解压缩后的数据一定会被放置到/etc/xxx去。如此一来,系统原本的/etc/下面的数据就会被备份数据所覆盖掉了,这是一件很可怕的事情。

但如果我们在压缩的时候使用-p参数,即可去掉根目录,假设我们将备份数据在/tmp中解开,那么解压缩后文件所在的路径就会是/tmp/etc/xxx。这样系统本身的/etc/就不会被覆盖了~

2. -P参数:保留根目录进行打包&压缩

如果你确实有需要备份根目录到tar文件中,那可以使用-P(大写)参数。

[root@centos7-master ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
...省略中间过程...
[root@centos7-master ~]# tar -jtf /root/etc.and.root.tar.bz2
...省略前面的输出...
/etc/smartmontools/
/etc/smartmontools/smartd.conf
/etc/smartmontools/smartd_warning.d/
/etc/smartmontools/smartd_warning.sh

可以看到,使用-P参数后,文件名内的根目录就会存在。

3.仅解压单一文件的方法

(1) 找到我们想要的文件名,如shadow文件

[root@centos7-master ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root 422 2020-05-01 20:34 etc/gshadow
---------- root/root 409 2020-05-01 20:25 etc/gshadow-
---------- root/root 786 2020-05-01 20:34 etc/shadow <==这是我们要的
---------- root/root 762 2020-05-01 20:25 etc/shadow-

(2) 将该文件解开,语法与实际方法如下:

[root@centos7-master ~]# tar -jxv -f 打包的文件.tar.bz2 待解开文件名
[root@centos7-master ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow

4. --exclede=FILE: 打包某目录,但不包含某些文件的方法

这里我们打包/etc/ /root 这几个目录,但排除/root/etc*开发的文件,排除我们本次打包新生成的文件/root/system.tar.bz2(不要打包自己),以此为例。

[root@centos7-master ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root

5. --newer-mtime=time 仅备份比time时刻还要新的文件

(1) 先由find找出比/etc/passwd还要新的文件

[root@centos7-master ~]# find /etc -newer /etc/passwd
...过程省略...
# 此时会显示出比/etc/passwd这个文件的mtime还要新的文件名 [root@centos7-master ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1107 May 1 20:34 /etc/passwd

(2) 使用tar进行打包,日期为上面看到的2020/05/01

[root@centos7-master ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2020/05/01" /etc/*
...中间省略...
/etc/X11/
/etc/X11/applnk/ <==这些是成功备份的文件
/etc/X11/fontpath.d/
...中间省略...
tar: /etc/yum.repos.d/CentOS-Vault.repo: file is unchanged; not dumped
tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped #这些是没有被备份的文件

(3) 显示出文件

[root@centos7-master ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | \
> grep -v '/$'
#grep -v 表示排除掉符合后面所跟条件的文件

6. 使用tar将文件打包到某些特殊设备中

磁带机(tape)由于是一次性读取/写入设备,因此我们不能够使用类似cp等命令来复制。如果想要将/home/etc/root 备份到磁带机(/dev/st0)时,可以用以下命令:

[root@centos7-master ~]# tar -cv -f /dev/st0 /home /root /etc

7. 特殊应用:利用管道命令与数据流

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

# 将/etc整个目录一边打包一边在/tmp中解开
[root@centos7-master ~]# cd /tmp
[root@centos7-master ~]# tar -cvf - /etc | tar -xvf -
# 要注意到,前面的压缩命令中,输入文件变成 - ;后面的解压缩命令中,输出命令也变成 - ;且中间有 | 作为管道
# 对于 - 的理解,可以将 - 想象成在内存中的一个设备(缓冲区—)
# 这种方式类似于cp -r /etc /tmp 但无需中间文件存在,可以将其看作是另一种方式进行复制的行为

参考文献

[1] 鸟哥(著).王世江(改编).鸟哥的Linux私房菜基础学习篇[M].北京:人民邮电出版社,2010.254-258

[2] Sam哥哥.Linux grep -v 命令排除输出[DB/OL].https://blog.csdn.net/linsongbin1/article/details/90515091,2019-05-24/2020-05-03

tar命令基本、进阶使用指北的更多相关文章

  1. Mac 软件包管理器Homebrew使用指北

    Homebrew Homebrew由开发者 Max Howell 开发,并基于 BSD 开源,是一个非常方便的软件包包管理器工具. Homebrew 官网 Homebrew 的几个核心概念 在正式介绍 ...

  2. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  3. Markdown 标记语言指北 - 源码

    这是上一篇博客的源代码. 这是班刊约稿的一篇文章. 全文约6000字, 预计需要 60 分钟读完. # Markdown 标记语言指北 #### TOC 1. [什么是 Markdown?](#%E4 ...

  4. 每天一个linux命令(28):tar命令

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...

  5. 菜鸟学Linux命令:tar命令 压缩与解压缩

    tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件. tar最初被用来在磁带上创建档案,现在,用户可以 ...

  6. tar命令参数笔记

    是指的linux下的tar命令,该命令的用法相当多,以下的内容来自tar的info手册 --numeric-owner This option will notify 'tar' thar it sh ...

  7. 每天一个linux命令(21):tar命令

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar 命令可以为linu ...

  8. ssh tar 命令把远程文件拉回来或推过去

    ssh tar 命令把远程文件拉回来或推过去 2010-09-11 21:55:35 分类: LINUX     登录22后tar 压缩/var/log目录输出到标准输入通过管道传到本地22_log. ...

  9. tar命令--解压缩

    tar命令是linux中的一个解压缩的命令.使用tar命令之前首先要搞清楚两个概念:打包和压缩.打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成一个小文件. 为什 ...

随机推荐

  1. MySQL学习之路1-Mac下启动连接MySQL服务

    MySQL简介 (MySQL是目前最流行的关系型数据库管理系统,现属于Oracle公司.) MySQL主要特点: 支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64 ...

  2. Python操作rabbitmq系列(五):根据主题分配消息

    接着上一章,使用exchange_type='direct'进行消息传递.这样消息会完全匹配后发送到对应的接收端.现在我们想干这样一件事: C1获取消息中包含:orange内容的消息,并且消息是由3个 ...

  3. Volatile不保证原子性(二)

    Volatile不保证原子性 前言 通过前面对JMM的介绍,我们知道,各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的. 这就可能存在一个线程AAA修改 ...

  4. Three.js实现3D地图实例分享

    本文主要给大家介绍了关于利用Three.js开发实现3D地图的实践过程,文中通过示例代码介绍的非常详细,对大家学习或者使用three.js具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 ...

  5. L17 AlexNet VGG NiN GoogLeNet

    深度卷积神经网络(AlexNet) LeNet: 在大的真实数据集上的表现并不尽如⼈意. 1.神经网络计算复杂. 2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域. 机器学习的特征提取:手工定 ...

  6. TCP基础概念

    定义 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议 特点 TCP是一种面向广域网的通信协议,目的是在跨越多个网 ...

  7. 运行一个nodejs服务,先发布为deployment,然后创建service,让集群外可以访问

    问题来源 海口-老男人 17:42:43 就是我要运行一个nodejs服务,先发布为deployment,然后创建service,让集群外可以访问 旧报纸 17:43:35 也就是 你的需求为 一个a ...

  8. python3购物车

    python3实现购物车小程序,优化后将程序分成函数,用文件注册和验证用户名密码. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 20 ...

  9. 详解 Hashtable

    至于HashTable,本人只想说,除了它们各自的特点是截然相反外,其余性质 以及 用法和HashMap的性质几乎一样, (有关Map集合的基本性质,请观看本人博文-- <详解 Map集合> ...

  10. JACTF Web部分

    掘安团队的题目 平台已不运营 Web签到 发现请求URL为flag.php,但是会跳转到404.php页面,抓包发现有302重定向,查看响应包,flag经过base64编码,解码即可 Tips: 重定 ...