zoukankan      html  css  js  c++  java
  • GNU tar

    2.tar教程

      2.4.常用选项

      2.5.两个选项

      2.6.创建档案文档

      2.7.查看档案文档内容

    4.tar操作

      4.1.基本操作

      4.2.高级操作

      4.3.“-c”的选项


    链接到压缩命令

    2.tar教程


    2.4.常用选项

    ===================

      三个常用选项,又叫三个常用操作模式。

    常用选项
    短选项长选项释义
    -c --create 创建新的档案
    -t --list 查看档案成员
    -x --extract 提取档案成员

    2.5.两个选项

    ===================

      要很好的理解三个操作模式,需要先了解“--file”和“--verbose”。因为她们很有用,使得操作更加明确,避免一些问题。

    2.5.1.选项“-f”

      

     long formshort form
    用法 --file=ARCHIVE-NAME -f ARCHIVE-NAME

      明确指定“tar”的操作对象。如果没有使用该选项明确指定,“tar”会去寻找环境变量“TAPE”以其变量值作为操作对象的档案名。
      通过指定环境变量,查看档案成员列表。

    [root@right practice]# ll
    total 24
    -rw-r--r--. 1 root root 10240 Dec 30 15:43 collection.tar
    -rw-r--r--. 1 root root 10240 Dec 30 15:06 music.tar
    [root@right practice]# export TAPE=/data/practice/music.tar
    [root@right practice]# cd
    [root@right ~]# tar -tf
    tar: option requires an argument -- 'f'
    Try `tar --help' or `tar --usage' for more information.
    [root@right ~]# tar -t
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh

      通过环境变量,提取档案成员。

    [root@right ~]# mkdir test
    [root@right ~]# cd test/
    [root@right test]# ll
    total 0
    [root@right test]# tar -x
    [root@right test]# ll
    total 0
    drwxr-xr-x. 2 root root 49 Dec 30 14:56 practice

      问题来了,要是没有设定这个环境变量呢?“tar”会去使用一个默认值作为操作对象。(设定的默认值,在该程序编译时指定的。)

      看看目前程序“tar”的默认值,很明显没有设定,答案就确定了,没有就会报错。

    [root@right test]# tar --show-defaults 
    --format=gnu -f- -b20 --quoting-style=escape 
    --rmt-command=/etc/rmt --rsh-command=/usr/bin/ssh

      正因为没有设定环境变量、没有默认值,所以建议在使用“tar”的时候,显式指定该选项及其值。

    2.5.2.选项“-v”

      某些操作没有任何显示('--create', '--append', '--update'),仅仅读取档案时会打印成员名('--list', '--extract', '--diff')。命令行上的每个“--verbose”都会将详细程度提高一级,因此要是需要输出更多的详细信息,可以使用两次。

    [root@right practice]# ll
    total 0
    -rw-r--r--. 1 root root 0 Dec 30 14:56 blues.sh
    -rw-r--r--. 1 root root 0 Dec 30 13:15 folk.sh
    -rw-r--r--. 1 root root 0 Dec 30 13:31 jazz.sh
    [root@right practice]# tar -cf collection.tar blues.sh folk.sh jazz.sh 
    [root@right practice]# tar -cvf collection.tar blues.sh folk.sh jazz.sh 
    blues.sh
    folk.sh
    jazz.sh
    [root@right practice]# tar -cvvf collection.tar blues.sh folk.sh jazz.sh 
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh

      依据文件类型,显示上有些特点。注意下面,最后两行显示的是硬链接、软链接的文件名。

    [root@right practice]# ln -T folk.sh folk 
    [root@right practice]# ln -s -T jazz.sh jazz
    [root@right practice]# tar -cvvf collection.tar blues.sh folk.sh jazz.sh folk jazz
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    hrw-r--r-- root/root         0 2016-12-30 13:15 folk link to folk.sh
    lrwxrwxrwx root/root         0 2017-01-01 15:48 jazz -> jazz.sh
    [root@right practice]# tar -tvf collection.tar 
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    hrw-r--r-- root/root         0 2016-12-30 13:15 folk link to folk.sh
    lrwxrwxrwx root/root         0 2017-01-01 15:48 jazz -> jazz.sh

    2.6 创建档案文件

    ===================

      创建档案时,要是目标文件存在,会自动覆盖,不会提示。

    2.6.1.把普通文件创建档案

    [root@right practice]# tar --create --file=collection.tar blues.sh folk.sh jazz.sh

      使用"--verbose"显示压缩过程

      没有指定档案名称,tar把第一个文件名作为档案名称。这里blues.sh成了最后的档案名,覆盖原来文件。

    [root@right practice]# tar -cvf blues.sh folk.sh jazz.sh 
    folk.sh
    jazz.sh
    [root@right practice]# ll
    total 24
    -rw-r--r--. 1 root root 10240 Dec 30 14:20 blues.sh
    -rw-r--r--. 1 root root 10240 Dec 30 13:39 collection.tar
    -rw-r--r--. 1 root root     0 Dec 30 13:15 folk.sh
    -rw-r--r--. 1 root root     0 Dec 30 13:31 jazz.sh
    [root@right practice]# file blues.sh 
    blues.sh: POSIX tar archive (GNU)
    [root@right practice]# tar -tf blues.sh 
    folk.sh
    jazz.sh

      使用短选项时“-cfv”,最后生成一个叫v的档案。所以得注意短选项的顺序。这样使用,最后得到的结果就不是预想的。

    [root@right practice]# tar -cfv *.sh
    [root@right practice]# ll
    total 44
    -rw-r--r--. 1 root root 10240 Dec 30 14:20 blues.sh
    -rw-r--r--. 1 root root 10240 Dec 30 13:39 collection.tar
    -rw-r--r--. 1 root root     0 Dec 30 13:15 folk.sh
    -rw-r--r--. 1 root root     0 Dec 30 13:31 jazz.sh
    -rw-r--r--. 1 root root 20480 Dec 30 14:29 v
    [root@right practice]# tar -tf v
    blues.sh
    folk.sh
    jazz.sh

      在不使用“-f”选项时,也可能出现意外。建议显式指定档案名称

    [root@right practice]# ll
    total 0
    -rw-r--r--. 1 root root 0 Dec 30 14:34 blues.sh
    -rw-r--r--. 1 root root 0 Dec 30 13:15 folk.sh
    -rw-r--r--. 1 root root 0 Dec 30 13:31 jazz.sh
    [root@right practice]# tar -cf *.sh
    [root@right practice]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Dec 30 14:34 blues.sh
    -rw-r--r--. 1 root root     0 Dec 30 13:15 folk.sh
    -rw-r--r--. 1 root root     0 Dec 30 13:31 jazz.sh
    [root@right practice]# file *
    blues.sh: POSIX tar archive (GNU)
    folk.sh:  empty
    jazz.sh:  empty
    [root@right practice]# tar -tf blues.sh 
    folk.sh
    jazz.sh

    2.6.2.把目录创建成档案

      归档目录时,把目录名称作为参数。

    [root@right data]# tar --create --verbose --file=music.tar practice
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh

      要是指定档案名称时少了一点,打成“-file”;档案名称就变成“ile=hihi.tar”。

    [root@right data]# tar --create --verbose -file=hihi.tar practice
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh
    [root@right data]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Dec 30 14:56 ile=hihi.tar
    drwxr-xr-x. 3 root root    36 Dec 30 13:24 mag
    drwxr-xr-x. 2 root root    49 Dec 30 14:56 practice
    drwxr-xr-x. 5 root root    84 Dec 30 11:08 zhaocai

    2.6.3.把普通文件创建档案

      打包压缩时,可以跳过某些文件不打包。使用选项“exclude”:

    $ tar --exclude=/data/tomcat_cb/logs/* -zcvf  tom.tgz /data/tomcat_cb/

      或者使用选项“-X”:

    $ tar -X /data/tomcat_cb/logs/* -zcvf  tom.tgz /data/tomcat_cb/

    2.7 查看档案文件内容

    ===================

      查看档案成员列表,以及档案成员属性。

    [root@right data]# tar --list --file=music.tar
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh

      查看详细内容,包括……

    [root@right data]# tar --list --verbose --file=music.tar
    drwxr-xr-x root/root         0 2016-12-30 14:56 practice/
    -rw-r--r-- root/root         0 2016-12-30 13:15 practice/folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 practice/jazz.sh
    -rw-r--r-- root/root         0 2016-12-30 14:56 practice/blues.sh

      查看档案中文件家成员的列表

    [root@right data]# tar --verbose --list --file=music.tar practice

      查看部分指定成员

    [root@right data]# tar --list --file=music.tar practice/jazz.sh
    practice/jazz.sh
    [root@right data]# tar --list --file=music.tar *jazz.sh
    practice/jazz.sh
    [root@right data]# tar --list --file=music.tar *s.*
    practice/blues.sh

      指定名称时,常常需要使用正则表达式,标准动作:

    [root@right data]# tar --list --file=music.tar --wildcards '*s.*'
    practice/blues.sh
     

    2.8 档案成员提取

    ===================

    2.8.1.提取整个档案,只需要指定档案名称即可。

    tar -xvf collection.tar

    2.8.2.提取档案中某个成员

      成员名称可通过“--list”(“-t”)获取。这里的成员名是一行显示的内容。

    [root@right practice]# tar --list --file=music.tar
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh

      提取文件时,遇到同名文件,直接覆盖没有任何提示。

    [root@right practice]# tar --extract --file=collection.tar jazz.sh
    [root@right practice]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Dec 30 15:43 collection.tar
    -rw-r--r--. 1 root root     0 Dec 30 13:31 jazz.sh

      成员名称问题,报错;因为上边查看时,成员实在文件夹下面的。

    [root@right practice]# tar --extract --file=music.tar folk.sh
    tar: folk.sh: Not found in archive
    tar: Exiting with failure status due to previous errors

      所以提取文件时连同创建时的目录路径名称一同指定,要不就得使用正则表达式来匹配名称。而且,提取后,文件是位于原始目录下的(*)。 提取文件时,遇到同名文件夹,要是解压在某个同名目录下,也是直接覆盖没有任何提示。 所以从一个不信任的源获取的档案,提取文件时需要另外建立目录,独立于已存在的工作目录操作。

    2.8.3.提取目录

      提取目录“practice”时,目录必须是档案里存在的成员。

    [root@right practice]# tar -tf music.tar 
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh
    [root@right practice]# tar -xf music.tar practice
    [root@right practice]# tar -xf music.tar practices
    tar: practices: Not found in archive
    tar: Exiting with failure status due to previous errors

      提取目录(档案成员),与提取某个成员类似。都存在覆盖而不提示的情况,这时可以使用选项改变()。

    4 tar操作


    4.1 GNU 'tar' 基本操作

    ===================

      基本操作(-c, -t, -x),之前有过解释,这里是些补充说明。

      '--create'    '-c'

      可以创建一个空的档案,而后用“--append”('-r')增加档案成员。这个用法有个问题,可能会导致两个严重的错误诞生(误操作下的文件覆盖)。

      ①当需要提取一个文档的全部成员时,把“-x”选项错误写成“-c”,无疑档案被覆盖了。②创建文件时,本来使用“--file”指定一个档案名称;而代替使用了“-f”选项同事忘记了给选项输入一个参数,那么一样覆盖了未来的档案成员(变成了一个空的档案)。

      由于这两个风险,这个操作(创建一个空档案)有必要被限制一下。

      所以,为了避免以上两个失误,同时还可以创建一个空档案。引入一个选项“--files-from”('-T'),没有该选项,将会阻止生成一个空档案。 创建一个空档案“hello.tar”,如下:

    [root@right practice]# ll
    total 0
    -rw-r--r--. 1 root root 0 Jan  1 17:36 jazz.sh
    [root@right practice]# tar -cf hello.tar
    tar: Cowardly refusing to create an empty archive
    Try `tar --help' or `tar --usage' for more information.
    [root@right practice]# tar -cf jazz.sh
    tar: Cowardly refusing to create an empty archive
    Try `tar --help' or `tar --usage' for more information.
    [root@right practice]# tar -cf hello.tar -T /dev/null
    [root@right practice]# tar cfT hello.tar /dev/null
    [root@right practice]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Jan  1 17:38 hello.tar
    -rw-r--r--. 1 root root     0 Jan  1 17:36 jazz.sh

    4.2 GNU 'tar' 高级操作

    ===================

      这里看一下‘tar’提供的五个更加专业的功能。

    4.2.1.append

      '--append'    '-r'

      往已存在的档案添加成员。 要是增加的新成员与老成员同名,不会覆盖,而是同时保留她们(属主、修改时间不同、也可以相同……)

    [root@right practice]# tar -rvf music.tar practice/folk.sh 
    practice/folk.sh
    [root@right practice]# tar -tvf music.tar 
    drwxr-xr-x root/root         0 2016-12-30 14:56 practice/
    -rw-r--r-- root/root         0 2016-12-30 13:15 practice/folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 practice/jazz.sh
    -rw-r--r-- root/root         0 2016-12-30 14:56 practice/blues.sh
    -rw-r--r-- root/root         6 2017-01-01 20:30 practice/folk.sh
    [root@right practice]# tar -tf music.tar 
    practice/
    practice/folk.sh
    practice/jazz.sh
    practice/blues.sh
    practice/folk.sh

      这时,提取的是同名文件中最新的(修改时间

    [root@right practice]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Jan  1 20:31 music.tar
    [root@right practice]# tar -xf music.tar prac*folk*
    [root@right practice]# ls -l practice/folk.sh 
    -rw-r--r--. 1 root root 6 Jan  1 20:30 practice/folk.sh

      这里提取的最新成员并不是“--extract”的设计目标。而是因为提取的顺序,所有同名档案成员都被提取出来了,最后出来的那个覆盖了前面的(还没有任何提示)。

      同样,当有了不可控的行为时,一定会出现(将来会出现)一个控制方法。如下边的情况,档案中有四个文件。上边三个文件内容不同,修改时间相同;下边两个文件修改时间不同,内容相同。

    [root@right practice]# tar -tvf hello.tar 
    -rw-r--r-- root/root         6 2017-01-01 21:01 hello
    -rw-r--r-- root/root         7 2017-01-01 21:01 hello
    -rw-r--r-- root/root         6 2017-01-01 21:01 hello
    -rw-r--r-- root/root         6 2017-01-01 21:02 hello

      使用选项,不带参数提取了最早的成员;带上参数就厉害了……(顺序从上往下)

    [root@right practice]# tar -xf hello.tar --occurrence hello && ll hello && cat hello
    -rw-r--r--. 1 root root 6 Jan  1 21:01 hello
    first
    [root@right practice]# tar -xf hello.tar --occurrence=2 hello && ll hello && cat hello
    -rw-r--r--. 1 root root 7 Jan  1 21:01 hello
    second
    [root@right practice]# tar -xf hello.tar --occurrence=3 hello && ll hello && cat hello
    -rw-r--r--. 1 root root 6 Jan  1 21:01 hello
    third
    [root@right practice]# tar -xf hello.tar --occurrence=4 hello && ll hello && cat hello
    -rw-r--r--. 1 root root 6 Jan  1 21:02 hello
    third

    4.2.2.update

      '--update'    '-u'

      用“更新”的文件替换档案中已存在的成员;使用时必须有“--file”选项。 跟“-r”一个效果,都是添加新成员到档案的末尾(而不会覆盖老文件)。

    [root@right practice]# ll
    total 16
    -rw-r--r--. 1 root root     6 Jan  1 21:30 hello
    -rw-r--r--. 1 root root 10240 Jan  1 21:02 hello.tar
    [root@right practice]# tar -uf hello.tar hello
    [root@right practice]# tar -tvf hello.tar 
    -rw-r--r-- root/root         6 2017-01-01 21:01 hello
    -rw-r--r-- root/root         7 2017-01-01 21:01 hello
    -rw-r--r-- root/root         6 2017-01-01 21:01 hello
    -rw-r--r-- root/root         6 2017-01-01 21:02 hello
    -rw-r--r-- root/root         6 2017-01-01 21:30 hello

      这个选项不适合备份资料,最终生成一个冗长的档案文件,‘tar’有专门的备份选项。

    4.2.3.concatenate

      '----concatenate'    '--catenate'    '-A'

      把多个档案放在另一个档案里(磁带不支持)。 源和目标档案,必须是已存在的。

    [root@right practice]# tar -tvf blues.tar 
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    [root@right practice]# tar -tvf folk.tar 
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh
    [root@right practice]# tar -tvf jazz.tar 
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    [root@right practice]# tar -cf hi.tar -T /dev/null
    [root@right practice]# tar -tf hi.tar 
    [root@right practice]# tar -A -f hi.tar blues.tar 
    [root@right practice]# tar -tf hi.tar 
    blues.sh
    [root@right practice]# tar -A -f hi.tar folk.tar 
    [root@right practice]# tar -tf hi.tar 
    blues.sh
    folk.sh
    [root@right practice]# tar -A -f hi.tar jazz.tar 
    [root@right practice]# tar -tf hi.tar 
    blues.sh
    folk.sh
    jazz.sh

    4.2.4.delete

      '--delete'

      删除档案成员(磁盘不支持), 删除所有版本的成员:

    [root@right practice]# tar -tvf hi.tar 
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    -rw-r--r-- root/root         0 2016-12-30 13:31 jazz.sh
    [root@right practice]# tar --delete --file=hi.tar jazz.sh
    [root@right practice]# tar -tvf hi.tar 
    -rw-r--r-- root/root         0 2016-12-30 14:56 blues.sh
    -rw-r--r-- root/root         0 2016-12-30 13:15 folk.sh

      

    4.2.5.compare

      '--compare'    '--diff'    '-d'

      比较档案成员与“文件系统中的她们”

    [root@right practice]# ll
    total 12
    -rw-r--r--. 1 root root 10240 Jan  1 22:19 hi.tar
    [root@right practice]# tar -xf hi.tar 
    [root@right practice]# tar -d -f hi.tar 
    [root@right practice]# tar -d -f hi.tar blues.sh folk.sh 
    [root@right practice]# touch blues.sh 
    [root@right practice]# echo "hello folk" > folk.sh 
    [root@right practice]# tar -d -f hi.tar blues.sh folk.sh 
    blues.sh: Mod time differs
    folk.sh: Mod time differs
    folk.sh: Size differs
    [root@right practice]# tar -d -f hi.tar 
    blues.sh: Mod time differs
    folk.sh: Mod time differs
    folk.sh: Size differs

    4.3 '-c'的选项

    ===================

    4.3.1.覆盖文件元数据

      '--mode=PERM'

      为档案添加的成员重新指定权限(chmod);可以接受8进制、字母

    $ tar -c -f arch.tar --mode='g+wx' dona

      '--mtime=DATE'

      修改成员的修改时间;

      ……

      '--owner=USER'

      '--group=GROUP'

      可以接受id、字符名称

      ……

    4.3.2.修改返回值

      '--ignore-failed-read'

      跳过无法读取的文件(、目录)时,返回值为零。

    4.4 '-x'的选项

    ===================

    4.5备份选项

    ===================

    4.6 值得注意的用法

    ===================

    5 备份和恢复


    常用用法


      解压到指定目录,使用大写的“C”

    # tar -xf apache-tomcat-7.4.32.tar.bz2 -C /data01/tomcat/
    一切代码都是为了生活,一切生活都是调剂
  • 相关阅读:
    磁盘IO性能监控(Linux 和 Windows)
    cacti监控linux和windows磁盘IO
    如何重新划分linux分区大小
    OCX控件打包成CAB并实现数字签名过程
    手把手教你用CAB发布OCX的简单办法
    WebLogic 11g重置用户密码
    rxswift的双向绑定
    投资的三个层次:投资的道与术--投资的一级算法
    《DSL》笔记一、什么是DSL(转)
    编程语言与世界观
  • 原文地址:https://www.cnblogs.com/argor/p/7918652.html
Copyright © 2011-2022 走看看