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/
一切代码都是为了生活,一切生活都是调剂
原文地址:https://www.cnblogs.com/argor/p/7918652.html