• Linux下 tar 命令介绍


    tar 是 tape archive 的缩写,tape是磁带的意思,也即把数据打包成到磁带文件,然后利用 gzip 和 bzip2 命令对磁带文件进行压缩存储
    ,所以在Linux上备份要经过两个步骤,一个是打包,另一个是进行压缩,这种形式一直沿用到现在,即打包和压缩是分开的

    本文将介绍 tar 命令的常见用法,包括如何创建打包文件,如何提取打包文件,从打包文件按中提取单个文件,查看打包文件内容,将文件或目录添加到打包文件中,通过这些实例,可以帮助你快速掌握 tar 命令

    创建打包文件

    使用 tar cvf 打包之后的文件名 需要打包的文件或者目录列表 命令格式对文件或目录进行打包

    [root@ecs-centos-7 dir]# tar cvf test.tar a.txt bar/
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# ll
    总用量 36
    -rw-r--r-- 1 root root 10240 11月  9 23:05 a.txt
    drwxr-xr-x 2 root root  4096 11月  9 23:02 bar
    -rw-r--r-- 1 root root 20480 11月  9 23:05 test.tar
    

    上面的例子中,打包后的文件名是 test.tar 需要打包的文件和目录分别是 a.txt bar/ , 选项 c 是创建打包文件, 选项 v 是输出打包过程,也就是对那些文件进行了打包,选项 f是生成打包文件

    上面使用 cvf 选项只是把多个文件或目录打包在一起,最终包文件test.tar大小并没有减少,可以使用 gzip 或者 bzip2 命令对 test.tar文件进行压缩

    其实,tar 命令中已经集成了 gzip 和 bzip2 压缩和解压缩选项了,只需要在 tar 命令选项中增加z(gzip) 或 j(bzip2) 选项, 打包的时候就会自动进行压缩

    [root@ecs-centos-7 dir]# tar cvzf test1.tar.gz a.txt bar/
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# tar cvjf test2.tar.bz2 a.txt bar/
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# ll
    总用量 44
    -rw-r--r-- 1 root root 10240 11月  9 23:05 a.txt
    drwxr-xr-x 2 root root  4096 11月  9 23:02 bar
    -rw-r--r-- 1 root root   199 11月  9 23:49 test1.tar.gz
    -rw-r--r-- 1 root root   199 11月  9 23:51 test2.tar.bz2
    -rw-r--r-- 1 root root 20480 11月  9 23:05 test.tar
    

    上面的例子中 cvzf 选项是打包并使用gzip压缩, cvjf选项是打包并使用bzip2压缩

    打包后的文件名为了好区分本次打包使用了哪种压缩方式,在文件名末尾加上压缩方式的后缀,gzip压缩后缀是.gz, bzip2压缩后缀是 .bz2,比如:test1.tar.gz 是以 gzip 方式压缩的,test2.tar.bz2 是以 bzip2 方式压缩的

    gzip 压缩速度比 bzip2 要快,但是压缩后的文件,bzip2 比 gzip 要小,也就是说 gzip 压缩速度快,bzip2 压缩体积小

    有时候我们打包一个目录,但是需要排除目录里面的一些文件, 可以使用 --exclude 选项过滤不需要打包的文件

    当前目录有2个子目录共8个文件,结构如下

    [root@ecs-centos-7 tmp]# tree
    .
    ├── ta
    │   ├── 12.txt
    │   ├── 3.txt
    │   ├── x1.mp4
    │   └── x2.mp4
    ├── tb
    │   ├── a.txt
    │   ├── b1.mp4
    │   └── b.txt
    └── tmp.txt
    
    
    • 打包当前目录以及子目录中所有非 *.mp4 文件
    [root@ecs-centos-7 tmp]# tar cvzf test.tar.gz * --exclude="*.mp4"
    ta/
    ta/3.txt
    ta/12.txt
    tb/
    tb/a.txt
    tb/b.txt
    tmp.txt
    

    上面的例子中,tar cvzf test.tar.gz * 命令是打包当前目录以及子目录所有的文件

    --exclude="*.mp4" 选项是过滤掉当前目录以及子目录中所有.mp4 文件

    从结果可以看出,最终打包的文件中并没有包含 ta 以及 tb 目录及其子目录中的 .mp4 文件

    • 打包当前目录以及子目录中所有文件,需要过滤tb目录中.txt 文件
    [root@ecs-centos-7 tmp]# tar cvzf test.tar.gz * --exclude="tb/*.txt"
    ta/
    ta/3.txt
    ta/x1.mp4
    ta/12.txt
    ta/x2.mp4
    tb/
    tb/b1.mp4
    tmp.txt
    

    上面的例子中, --exclude="tb/*.txt" 选项是过滤掉 tb 目录及其子目录中所有的 .txt 文件

    最终打包的文件中,没有包含 tb 目录及其子目录中的 .txt 文件

    解开打包文件

    解压打包文件,只需要把打包中的 c 选项换成 x 选项即可,针对使用 gzip 或 bzip2 压缩过的打包文件,解压缩的时候相对应的使用 zj 选项

    [root@ecs-centos-7 dir]# mkdir -p test test1 test2
    [root@ecs-centos-7 dir]# tar -xvf test.tar -C test
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# tar -xvzf test1.tar.gz -C test1
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# tar -xvjf test2.tar.bz2 -C test2
    a.txt
    bar/
    bar/b.txt
    [root@ecs-centos-7 dir]# ll test test1 test2
    test:
    总用量 16
    -rw-r--r-- 1 root root 10240 11月  9 23:05 a.txt
    drwxr-xr-x 2 root root  4096 11月  9 23:02 bar
    
    test1:
    总用量 16
    -rw-r--r-- 1 root root 10240 11月  9 23:05 a.txt
    drwxr-xr-x 2 root root  4096 11月  9 23:02 bar
    
    test2:
    总用量 16
    -rw-r--r-- 1 root root 10240 11月  9 23:05 a.txt
    drwxr-xr-x 2 root root  4096 11月  9 23:02 bar
    

    上面例子中,首先创建 test、test1、test2 三个目录,分别对应于 test.tar、test1.tar.gz、test2.tar.bz2 三个打包文件解压缩的目标目录

    -C 选项表示解压到哪个目录,如果不加这个选项,默认是解压到当前目录

    列出打包文件内容

    有时候需要不解压包就能查看包体中有哪些文件, t 选项可以解决这个问题

    [root@ecs-centos-7 dir]# tar tvf test1.tar.gz 
    -rw-r--r-- root/root     10240 2020-11-09 23:05 a.txt
    drwxr-xr-x root/root         0 2020-11-09 23:02 bar/
    -rw-r--r-- root/root         7 2020-11-09 23:02 bar/b.txt
    

    上面的例子列出了 test1.tar.gz 由哪些文件打包而成的,从输出结果可以知道,它包含了 a.txt、bar/ 、bar/b.txt 三个文件

    也可以使用 tar --list --file=test1.tar.gz 命令列出包中所有的文件

    提取包中指定的文件

    既然不解压包就能查看包体中包含哪些文件,那有没有办法提取包体中指定的文件呢? 有的,下面的实例是从包中提取指定的文件列表

    [root@ecs-centos-7 tt]# tar tvf test1.tar.gz 
    -rw-r--r-- root/root        10 2020-11-10 23:10 a.txt
    drwxr-xr-x root/root         0 2020-11-09 23:02 bar/
    -rw-r--r-- root/root         7 2020-11-09 23:02 bar/b.txt
    
    [root@ecs-centos-7 tt]# tar -xvzf test1.tar.gz a.txt
    a.txt
    [root@ecs-centos-7 tt]# tar -xvzf test1.tar.gz "*.txt"
    a.txt
    bar/b.txt
    

    例子中首先使用 tar tvf test1.tar.gz 命令列出包中包含的文件

    命令 tar -xvzf test1.tar.gz a.txt 从包中提取 a.txt文件

    命令 tar -xvzf test1.tar.gz "*.txt" 从包中提取所有的 .txt 后缀的文件

    如果要从包中提取多个文件,可以使用类似 tar -xvzf test1.tar.gz 文件1 文件2 的命令

    命令 tar --extract --file=test1.tar.gz "文件1" "文件2" 也可以实现从包中提取多个文件

    添加文件或目录到打包文件中

    有的时候需要把外部一个文件添加到一个打包好的文件中,可以通过 r实现

    注意:如果打包好的文件是压缩过的(通过gzip或者bzip2), 则不支持把外部文件添加进去

    [root@ecs-centos-7 tt]# tar tvf test.tar 
    -rw-r--r-- root/root        10 2020-11-10 23:10 a.txt
    drwxr-xr-x root/root         0 2020-11-09 23:02 bar/
    -rw-r--r-- root/root         7 2020-11-09 23:02 bar/b.txt
    [root@ecs-centos-7 tt]# tar -rvf test.tar 12.txt ta/
    12.txt
    ta/
    ta/r5.txt
    [root@ecs-centos-7 tt]# tar tvf test.tar 
    -rw-r--r-- root/root        10 2020-11-10 23:10 a.txt
    drwxr-xr-x root/root         0 2020-11-09 23:02 bar/
    -rw-r--r-- root/root         7 2020-11-09 23:02 bar/b.txt
    -rw-r--r-- root/root         8 2020-11-10 23:28 12.txt
    drwxr-xr-x root/root         0 2020-11-10 23:36 ta/
    -rw-r--r-- root/root         5 2020-11-10 23:36 ta/r5.txt
    

    上面的例子中,test.tar 原来只包含 a.txt、bar/、bar/b.txt三个文件

    执行 tar -rvf test.tar 12.txt ta/ 命令之后把 12.txt、ta目录添加进去了

    最后查看test.tar,它包含了 a.txt、bar/、bar/b.txt、12.txt、ta/、tar/r5.txt 六个文件

    小结

    本文介绍了tar命令的常见用法,更多 tar 命令的使用可以通过 man tar去了解

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/wanng/p/14238644.html
Copyright © 2020-2023  润新知