0037. shell命令--tar

37. shell命令--tar

功能说明

        tar 命令是 Linux 和 Unix 系统中用于打包和解包文件的工具。它可以用来归档多个文件和目录到一个 .tar 文件中,也可以从这些归档文件中解出文件。tar 命令本身不提供压缩功能,但它可以与压缩程序(如 gzip, bzip2, xz 等)结合使用,以减小归档文件的大小。

        tar 命令可以为 linux 的文件和目录创建档案。利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用 tar 命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

        首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

        为什么要区分这两个概念呢?这源于 Linux 中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包( tar 命令),然后再用压缩程序进行压缩( gzip bzip2 命令)。

tar作为一款开源于磁带备份技术的命令行工具,主要负责生成归档文件。该工具能把多个文件和目录整合为单一文件,同时还可以选择是否附加压缩功能。例如,在 Linux 系统环境下,经常利用 tar 命令来制作诸如.tar无压缩版本、.tar.gz 基于 gzip 的压缩版、以及 .tar.bz2 基于 bzip2 的压缩版等各类归档文件。

        利用 tar 指令,可便捷地实现多文件乃至整个目录的打包为一个档案文件,便于数据转移、储存及备份。同时,该指令亦提供了解压与解包功能,便于提取所需文档。

语法格式

tar [选项]... [文件]...

SYNOPSIS
       tar [OPTION...] [FILE]..

选项说明

选项1

-A或--catenate 新增文件到已存在的备份文件。
-b<区块数目>或--blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
-B或--read-full-records 读取数据时重设区块大小。
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
-f<备份文件>或--file=<备份文件> 指定备份文件。(指定归档文件的名称。注意,-f 选项通常放在选项的最后,后面紧跟归档文件的名称)
-F<Script文件>或--info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
-g或--listed-incremental 处理GNU格式的大量备份。
-G或--incremental 处理旧的GNU格式的大量备份。
-h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
-i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
-j 通过 bzip2 压缩或解压缩归档文件。
-J 通过 xz 压缩或解压缩归档文件。
-k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
-K<文件>或--starting-file=<文件> 从指定的文件开始还原。
-l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
-L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
-m或--modification-time 还原文件时,不变更文件的更改时间。
-M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
-N<日期格式>或--newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
-o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
-O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
-p或--same-permissions 用原来的文件权限还原文件。
-P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-r或--append 新增文件到已存在的备份文件的结尾部分。(向归档文件中追加文件。)
-R或--block-number 列出每个信息在备份文件中的区块编号。
-s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
-S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
-t或--list 列出备份文件的内容。(列出归档文件中的内容,不解压)
-T<范本文件>或--files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
-u或--update 仅置换较备份文件内的文件更新的文件。(只将比归档文件中同名文件更新的文件添加到归档文件中)
-U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
-v或--verbose 显示指令执行过程。(在处理文件时显示详细信息)
-V<卷册名称>或--label=<卷册名称> 建立使用指定的卷册名称的备份文件。
-w或--interactive 遭遇问题时先询问用户。
-W或--verify 写入备份文件后,确认文件正确无误。
-x或--extract或--get 从备份文件中还原文件(从归档文件中提取文件)。
-X<范本文件>或--exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。(通过 gzip 压缩或解压缩归档文件)
-Z或--compress或--uncompress 通过compress指令处理备份文件。
-<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
--after-date=<日期时间> 此参数的效果和指定"-N"参数相同。
--atime-preserve 不变更文件的存取时间。
--backup=<备份方式>或--backup 移除文件前先进行备份。
--checkpoint 读取备份文件时列出目录名称。
--concatenate 此参数的效果和指定"-A"参数相同。
--confirmation 此参数的效果和指定"-w"参数相同。
--delete 从备份文件中删除指定的文件。
--exclude=<范本样式> 排除符合范本样式的文件。
--group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
--help 在线帮助。
--ignore-failed-read 忽略数据读取错误,不中断程序的执行。
--new-volume-script=<Script文件> 此参数的效果和指定"-F"参数相同。
--newer-mtime 只保存更改过的文件。
--no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
--null 从null设备读取文件名称。
--numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
--owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
--posix 将数据写入备份文件时使用POSIX格式。
--preserve 此参数的效果和指定"-ps"参数相同。
--preserve-order 此参数的效果和指定"-A"参数相同。
--preserve-permissions 此参数的效果和指定"-p"参数相同。
--record-size=<区块数目> 此参数的效果和指定"-b"参数相同。
--recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
--remove-files 文件加入备份文件后,就将其删除。
--rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
--same-owner 尝试以相同的文件拥有者还原文件。
--suffix=<备份字尾字符串> 移除文件前先行备份。
--totals 备份文件建立后,列出文件大小。
--use-compress-program=<执行指令> 通过指定的指令处理备份文件。
--version 显示版本信息。
--volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号。

选项2

-A, --catenate, --concatenate     追加 tar 文件至归档
-c, --create                      创建一个新归档
-d, --diff, --compare             找出归档和文件系统的差异
    --delete                      从归档(非磁带!)中删除
-r, --append                      追加文件至归档结尾
-t, --list                        列出归档内容
    --test-label                  测试归档卷标并退出
-u, --update                      仅追加比归档中副本更新的文件
-x, --extract, --get              从归档中解出文件

操作修饰符:

      --check-device                      当创建增量归档时检查设备号(默认)
  -g, --listed-incremental=FILE           处理新式的 GNU 格式的增量备份
  -G, --incremental                       处理老式的 GNU 格式的增量备份
      --ignore-failed-read                  当遇上不可读文件时不要以非零值退出
      --level=NUMBER                      所创建的增量列表归档的输出级别
  -n, --seek                              归档可检索
      --no-check-device                   当创建增量归档时不要检查设备号
      --no-seek                           归档不可检索
      --occurrence[=NUMBER]               仅处理归档中每个文件的第 NUMBER 个事件;
                                        仅当与以下子命令 --delete, --diff, --extract 或是 --list中的一个联合使用时,
                                        此选项才有效。而且不管文件列表是以命令行形式给出或是通过 -T 选项指定的;NUMBER 值默认为 1
      --sparse-version=MAJOR[.MINOR]    设置所用的离散格式版本(隐含--sparse)
  -S, --sparse                            高效处理离散文件

重写控制:

  -k, --keep-old-files       don't replace existing files when extracting,
                             treat them as errors
      --keep-directory-symlink   preserve existing symlinks to directories when
                             extracting
      --keep-newer-files
                             不要替换比归档中副本更新的已存在的文件
      --no-overwrite-dir     保留已存在目录的元数据
      --overwrite            解压时重写存在的文件
      --overwrite-dir        解压时重写已存在目录的元数据(默认)

      --recursive-unlink     解压目录之前先清除目录层次
      --remove-files         在添加文件至归档后删除它们
      --skip-old-files       don't replace existing files when extracting,silently skip over them
  -U, --unlink-first         在解压要重写的文件之前先删除它们
  -W, --verify               在写入以后尝试校验归档

选择输出流:

      --ignore-command-error     忽略子进程的退出代码
      --no-ignore-command-error  将子进程的非零退出代码认为发生错误
  -O, --to-stdout                解压文件至标准输出
      --to-command=COMMAND       将解压的文件通过管道传送至另一个程序

操作文件属性:

      --atime-preserve[=METHOD]
                             在输出的文件上保留访问时间,要么通过在读取(默认
                             METHOD=‘replace’)后还原时间,要不就不要在第一次(METHOD=‘system’)设置时间
      --delay-directory-restore
                             直到解压结束才设置修改时间和所解目录的权限
      --group=名称         强制将 NAME
                             作为所添加的文件的组所有者
      --mode=CHANGES         强制将所添加的文件(符号)更改为权限
                             CHANGES
      --mtime=DATE-OR-FILE   从 DATE-OR-FILE 中为添加的文件设置
                             mtime
  -m, --touch                不要解压文件的修改时间
      --no-delay-directory-restore
                             取消 --delay-directory-restore 选项的效果
      --no-same-owner
                             将文件解压为您所有(普通用户默认此项)
      --no-same-permissions
                             从归档中解压权限时使用用户的掩码位(默认为普通用户服务)
      --numeric-owner        总是以数字代表用户/组的名称
      --owner=名称         强制将 NAME
                             作为所添加的文件的所有者
  -p, --preserve-permissions, --same-permissions
                             解压文件权限信息(默认只为超级用户服务)
      --preserve             与 -p 和 -s 一样
      --same-owner
                             尝试解压时保持所有者关系一致(超级用户默认此项)
  -s, --preserve-order, --same-order
                             member arguments are listed in the same order as
                             the files in the archive

 Handling of extended file attributes:

      --acls                 Enable the POSIX ACLs support
      --no-acls              Disable the POSIX ACLs support
      --no-selinux           Disable the SELinux context support
      --no-xattrs            Disable extended attributes support
      --selinux              Enable the SELinux context support
      --xattrs               Enable extended attributes support
      --xattrs-exclude=MASK  specify the exclude pattern for xattr keys
      --xattrs-include=MASK  specify the include pattern for xattr keys

设备选择和切换:

  -f, --file=ARCHIVE         使用归档文件或 ARCHIVE 设备
      --force-local
                             即使归档文件存在副本还是把它认为是本地归档
  -F, --info-script=名称, --new-volume-script=名称
                             在每卷磁带最后运行脚本(隐含 -M)
  -L, --tape-length=NUMBER   写入 NUMBER × 1024 字节后更换磁带
  -M, --multi-volume         创建/列出/解压多卷归档文件
      --rmt-command=COMMAND  使用指定的 rmt COMMAND 代替 rmt
      --rsh-command=COMMAND  使用远程 COMMAND 代替 rsh
      --volno-file=FILE      使用/更新 FILE 中的卷数

设备分块:

  -b, --blocking-factor=BLOCKS      每个记录 BLOCKS x 512 字节
  -B, --read-full-records            读取时重新分块(只对 4.2BSD 管道有效)
  -i, --ignore-zeros                 忽略归档中的零字节块(即文件结尾)
      --record-size=NUMBER           每个记录的字节数 NUMBER,乘以 512

选择归档格式:

  -H, --format=FORMAT        创建指定格式的归档

 FORMAT 是以下格式中的一种:

    gnu                      GNU tar 1.13.x 格式
    oldgnu                   GNU 格式 as per tar <= 1.12
    pax                      POSIX 1003.1-2001 (pax) 格式
    posix                    等同于 pax
    ustar                    POSIX 1003.1-1988 (ustar) 格式
    v7                       old V7 tar 格式

      --old-archive, --portability
                             等同于 --format=v7
      --pax-option=关键字[[:]=值][,关键字[[:]=值]]...
                             控制 pax 关键字
      --posix                等同于 --format=posix
  -V, --label=TEXT           创建带有卷名 TEXT
                             的归档;在列出/解压时,使用 TEXT
                             作为卷名的模式串

压缩选项:

  -a, --auto-compress        使用归档后缀名来决定压缩程序
  -I, --use-compress-program=PROG
                             通过 PROG 过滤(必须是能接受 -d
                             选项的程序)
  -j, --bzip2                通过 bzip2 过滤归档
  -J, --xz                   通过 xz 过滤归档
      --lzip                 通过 lzip 过滤归档
      --lzma                 通过 lzma 过滤归档
      --lzop
      --no-auto-compress     不使用归档后缀名来决定压缩程序
  -z, --gzip, --gunzip, --ungzip   通过 gzip 过滤归档
  -Z, --compress, --uncompress   通过 compress 过滤归档

本地文件选择:

      --add-file=FILE        添加指定的 FILE 至归档(如果名字以 -
                             开始会很有用的)
      --backup[=CONTROL]     在删除前备份,选择 CONTROL 版本
  -C, --directory=DIR        改变至目录 DIR
      --exclude=PATTERN      排除以 PATTERN 指定的文件
      --exclude-backups      排除备份和锁文件
      --exclude-caches       除标识文件本身外,排除包含
                             CACHEDIR.TAG 的目录中的内容
      --exclude-caches-all   排除包含 CACHEDIR.TAG 的目录
      --exclude-caches-under 排除包含 CACHEDIR.TAG 的目录中所有内容

      --exclude-tag=FILE     除 FILE 自身外,排除包含 FILE
                             的目录中的内容
      --exclude-tag-all=FILE 排除包含 FILE 的目录
      --exclude-tag-under=FILE   排除包含 FILE 的目录中的所有内容
      --exclude-vcs          排除版本控制系统目录
  -h, --dereference
                             跟踪符号链接;将它们所指向的文件归档并输出
      --hard-dereference
                             跟踪硬链接;将它们所指向的文件归档并输出
  -K, --starting-file=MEMBER-NAME
                             begin at member MEMBER-NAME when reading the
                             archive
      --newer-mtime=DATE     当只有数据改变时比较数据和时间
      --no-null              禁用上一次的效果 --null 选项
      --no-recursion         避免目录中的自动降级
      --no-unquote           不以 -T 读取的文件名作为引用结束
      --null                 -T 读取以空终止的名字,-C 禁用
  -N, --newer=DATE-OR-FILE, --after-date=DATE-OR-FILE
                             只保存比 DATE-OR-FILE 更新的文件
      --one-file-system      创建归档时保存在本地文件系统中
  -P, --absolute-names       不要从文件名中清除引导符‘/’
      --recursion            目录递归(默认)
      --suffix=STRING        在删除前备份,除非被环境变量
                             SIMPLE_BACKUP_SUFFIX
                             覆盖,否则覆盖常用后缀(‘’)
  -T, --files-from=FILE      从 FILE
                             中获取文件名来解压或创建文件
      --unquote              以 -T
                             读取的文件名作为引用结束(默认)
  -X, --exclude-from=FILE    排除 FILE 中列出的模式串

文件名变换:

      --strip-components=NUMBER   解压时从文件名中清除 NUMBER 个引导部分                        
      --transform=EXPRESSION, --xform=EXPRESSION    使用 sed 代替 EXPRESSION 来进行文件名变换
                             
                             

文件名匹配选项(同时影响排除和包括模式串):

      --anchored             模式串匹配文件名头部
      --ignore-case          忽略大小写
      --no-anchored          模式串匹配任意‘/’后字符(默认对
                             exclusion 有效)
      --no-ignore-case       匹配大小写(默认)
      --no-wildcards         逐字匹配字符串
      --no-wildcards-match-slash   通配符不匹配‘/’
      --wildcards            use wildcards (default)
      --wildcards-match-slash
                             通配符匹配‘/’(默认对排除操作有效)

提示性输出:

      --checkpoint[=NUMBER]  每隔 NUMBER
                             个记录显示进度信息(默认为 10 个)
      --checkpoint-action=ACTION   在每个检查点上执行 ACTION
      --full-time            print file time to its full resolution
      --index-file=FILE      将详细输出发送至 FILE
  -l, --check-links
                             只要不是所有链接都被输出就打印信息
      --no-quote-chars=STRING   禁用来自 STRING 的字符引用
      --quote-chars=STRING   来自 STRING 的额外的引用字符
      --quoting-style=STYLE  设置名称引用风格;有效的 STYLE
                             值请参阅以下说明
  -R, --block-number         每个信息都显示归档内的块数
      --show-defaults        显示 tar 默认选项
      --show-omitted-dirs
                             列表或解压时,列出每个不匹配查找标准的目录
      --show-transformed-names, --show-stored-names
                             显示变换后的文件名或归档名
      --totals[=SIGNAL]      处理归档后打印出总字节数;当此
                             SIGNAL 被触发时带参数 -
                             打印总字节数;允许的信号为:
                             SIGHUP,SIGQUIT,SIGINT,SIGUSR1 和
                             SIGUSR2;同时也接受不带 SIG
                             前缀的信号名称
      --utc                  以 UTC 格式打印文件修改时间
  -v, --verbose              详细地列出处理的文件
      --warning=KEYWORD      警告控制:
  -w, --interactive, --confirmation
                             每次操作都要求确认

兼容性选项:

  -o                         创建归档时,相当于
                             --old-archive;展开归档时,相当于
                             --no-same-owner

其它选项:

  -?, --help                 显示此帮助列表
      --restrict             禁用某些潜在的有危险的选项
      --usage                显示简短的用法说明
      --version              打印程序版本

长选项和相应短选项具有相同的强制参数或可选参数。

除非以 --suffix 或 SIMPLE_BACKUP_SUFFIX
设置备份后缀,否则备份后缀就是“~”。
可以用 --backup 或 VERSION_CONTROL 设置版本控制,可能的值为:

  none, off       从不做备份
  t, numbered     进行编号备份
  nil, existing
如果编号备份存在则进行编号备份,否则进行简单备份
  never, simple   总是使用简单备份

--quoting-style 选项的有效参数为:

  literal
  shell
  shell-always
  c
  c-maybe
  escape
  locale
  clocale

此 tar 默认为:
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/etc/rmt
--rsh-command=/usr/bin/ssh

实践操作

0. 环境准备
mkdir -p /test/tar/dir1
cd /test/tar
touch dir1/file1.txt
ls
ls dir1/

1. 创建归档文件(打包)
1.1 归档文件(不压缩)
tar -cf test1.tar dir1/    #创建一个名为 test1.tar 的归档文件,包含 dir1/ 目录下的所有文件和子目录
tar cvf test1.tar dir1/    #前面 - 可以省略,-v 选项显示创建过程

1.2 压缩归档文件
tar zcf test2.tar.gz dir1/    #使用 gzip 压缩归档文件(压缩文件)格式为 .tar.gz 或 .tgz
tar jcf test3.tar.bz2 dir1/    #使用 bzip2 压缩归档文件(压缩文件)格式为 .tar.bz2 或 .tbz2
ll    #发现大小不一样

2. 查看(列出)归档文件中的内容
ls
tar tf test1.tar    #这会列出归档文件中的所有文件和目录,但不会解压它们

tar tvf test2.tar.gz    

tar tvf test3.tar.bz2

3. 从归档文件中提取文件(解包,解压)
3.1 默认位置
ls
rm -rf dir1/
ls
tar xf test1.tar    #使用 xf 选项进行提取文件 
ls
ls dir1/
rm -rf dir1/
tar xf test2.tar.gz    #杠可以省略,压缩的归档文件,也可以,若不可以,加个 zxf 选项
ls
ls dir1/
rm -rf dir1/
tar -xf test3.tar.bz2    #使用 xf 选项也可以提取此类压缩文件
ls dir1/

3.2 指定路径
mkdir dir2
ls dir2
tar xf test2.tar.gz -C dir2    #使用 -C 选项后边加上指定的文件的路径,指定解压位置
ls dir2
ls dir2/dir1/

4. 向归档文件中追加文件
#注:在压缩过的 tar 文件中无法进行追加文件操作
ls
touch file2.txt
tar tf test1.tar 
tar rf test1.tar file2.txt 
tar tf test1.tar 
touch dir1/file3.txt
tar tf test2.tar.gz 
tar rf test2.tar.gz dir1/file3.txt    #报错
tar rf test2.tar.gz file2.txt    #报错
tar rf test3.tar.bz2 file2.txt    #报错  
tar rjf test3.tar.bz2 dir1/file3.txt    #报错
tar tf test1.tar
tar rf test1.tar dir1/file3.txt    #所以归档文件可以追加,而压缩文件不行追加
tar tf test1.tar

5. 排除特定文件或目录后创建 tar 文件
5.1 忽略文件方法1
ls
mv file2.txt test* dir1/
ls
tar zcf exclude1.tar.gz --exclude=./dir1/'test*' dir1/    #这种 ./ 写法并未生效,原因百度看看
#在使用tar命令打包时,如果你想排除当前目录下的某个文件或文件夹,使用./是不正确的。
#tar命令中使用--exclude选项时,./是多余的,可以直接写文件或文件夹名。
#如果你尝试使用./,比如--exclude=./file_or_directory_to_exclude,这实际上是在指定一个相对路径
#tar会尝试在包内搜索这个相对路径,而不是当前目录下的文件
#这就是为什么你看到--exclude使用./不生效的原因
ls
tar tf exclude1.tar.gz 
tar zcf exclude2.tar.gz --exclude=dir1/'test*' dir1/    #直接跟文件的路径就行 
tar tf exclude2.tar.gz    #成功排除指定
tar zcf exclude3.tar.gz --exclude=dir1/'test*' --exclude=dir1/file3.txt dir1/    #还可以添加
tar tf exclude2.tar.gz 

5.2 忽略文件方法2
ls
mv exclude* dir1/
ls
ls dir1/
echo -e "exclude*\ntest*" >excludefile
cat excludefile 

tar zcf exclude4.tar.gz --exclude-from excludefile dir1/
tar tf exclude4.tar.gz 

5.3 忽略目录路径
ls
mv exclude* dir1
ls dir1/
tar zcf exclude_dirname1.tar.gz -C dir1/ file1.txt    #先写一个看看 
tar zcf exclude_dirname2.tar.gz -C dir1/ file1.txt file2.txt file3.txt    #要打包哪个写哪个
tar tf exclude_dirname1.tar.gz 
tar tf exclude_dirname2.tar.gz 
tar tf dir1/exclude4.tar.gz 
tar zcf exclude_dirname3.tar.gz -C dir1/ *.txt    #这样写,不行
tar tf exclude_dirname3.tar.gz    #没有内容
tar zcf exclude_dirname3.tar.gz -C dir1/ dir1/*.txt    #这样写也不行
tar zcf exclude_dirname3.tar.gz -C dir1/ file{1..3}.txt    #这样可以
tar tf exclude_dirname3.tar.gz 
tar zcf exclude_dirname4.tar.gz -C dir1/ $(ls dir1/)    #使用这种方法进行取所有
tar tf exclude_dirname4.tar.gz 
echo $(ls dir1/) 

6. 差异与增量备份
6.1 各种备份
a> 完整备份(第一次备份)
ls
mv exclude_dirname* dir1/
ls
ls dir2/
ls dir2/dir1/
cat dir2/dir1/file1.txt
tar -g snapshot -zcf full-1.tar.gz dir2/
tar tf full-1.tar.gz
ls
cat snapshot

b> 差异备份(第二次备份)
echo test >dir2/dir1/file1.txt
cat dir2/dir1/file1.txt
tar -g snapshot -zcf difference-2.tar.gz dir2/
tar tf difference-2.tar.gz

c> 增量备份(第三次备份)
touch dir2/file2.txt
ll dir2/file2.txt
tar -g snapshot -zcf increment-3.tar.gz dir2/
tar tf increment-3.tar.gz 

6.2 顺序还原
#按打包顺序进行还原
ls
rm -rf dir2/
tar xf full-1.tar.gz 
ls 
ls dir2/
ls dir2/dir1/file1.txt 
cat dir2/dir1/file1.txt
tar xf difference-2.tar.gz
ls dir2/
cat dir2/dir1/file1.txt
tar xf increment-3.tar.gz 
cat dir2/dir1/file1.txt
ls dir2/

6.3 非顺序还原
a 顺序1
ls
rm -rf dir2
tar xf increment-3.tar.gz
ls
ls dir2/
ls dir2/dir1/
tar xf full-1.tar.gz 
ls dir2/dir1/
cat dir2/dir1/file1.txt 
tar xf difference-2.tar.gz 
cat dir2/dir1/file1.txt 
ls dir2/

b 顺序2
ls
rm -rf dir2
tar xf increment-3.tar.gz 
tar xf difference-2.tar.gz
tar xf full-1.tar.gz 
cat dir2/dir1/file1.txt 
ls dir2/
tar xf difference-2.tar.gz
tar xf full-1.tar.gz 
cat dir2/dir1/file1.txt 
ls dir2/
tar xf difference-2.tar.gz
cat dir2/dir1/file1.txt 
ls dir2/

7. 使用 -T 及 -X 创建压缩归档文件
ls
echo dir2 >tar_include    #要进行归档的目录
echo dir1 >tar_exclude    #排除归档的目录
tar zcf mybackup_$(date +%F).tgz -T tar_include -X tar_exclude
ls
tar tf mybackup*

8. 查看压缩包大小
ls dir1/
ll dir1/test*
tar zcf - dir1/test1.tar |wc -c
tar zcf - dir1/test2.tar.gz |wc -c
tar zcf - dir1/test3.tar.bz2 |wc -c
wc -c dir1/test3.tar.bz2

9. 打包软链接文件(参数:-h)
9.1 环境准备
echo test soft link > testfile
ln -s testfile testfile_soft_link
ll testfile*

9.2 分别打包
tar zcf soft1.tar.gz testfile_soft_link    #不加参数-h
tar zcfh soft2.tar.gz testfile_soft_link    #加参数-h
tar tf soft1.tar.gz 
tar tf soft2.tar.gz 

9.3 分别解压
mkdir test{1,2}
tar xf soft1.tar.gz -C test1
tar xf soft2.tar.gz -C test2
ls test1/
ls test2/
ll test1/testfile_soft_link 
ll test2/testfile_soft_link 
cat test1/testfile_soft_link
cat test2/testfile_soft_link

注意事项

  • 使用 tar 时,请确保 -f 选项紧跟在选项之后,并直接指向要创建的或要提取的档案文件的名称。
  • 压缩和解压缩时,请确保使用与打包时相同的压缩选项(z、j 或 J)。
  • tar 的输出默认是写入标准输出的,但使用 -f 选项可以指定输出到文件。
  • tar 还可以用于文件的备份和恢复,因为它能够保留文件的所有权限、时间戳、链接等属性。
  • tar命令的选项前可以省略“-”,在解压时无需选择“-z”或“-j”,命令可以自行识别
  • tar命令通过-zcf 选项创建打包压缩文件时(.tar.gz = .tgz)

其它拓展

zip格式

压缩: zip -r [目标文件名].zip [原文件/目录名]

解压: unzip [原文件名].zip

注:-r参数代表递归

tar格式(该格式仅仅打包,不压缩)

打包:tar -cvf [目标文件名].tar [原文件名/目录名]

解包:tar -xvf [原文件名].tar

注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。

tar.gz格式

方式一:利用前面已经打包好的tar文件,直接用压缩命令。

压缩:gzip [原文件名].tar

解压:gunzip [原文件名].tar.gz

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]

解压并解包: tar -zxvf [原文件名].tar.gz

注:z代表用gzip算法来压缩/解压。

tar.bz2格式

方式一:利用已经打包好的tar文件,直接执行压缩命令:

压缩:bzip2 [原文件名].tar

解压:bunzip2 [原文件名].tar.bz2

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -jcvf [目标文件名].tar.bz2 [原文件名/目录名]

解压并解包: tar -jxvf [原文件名].tar.bz2

注:小写j代表用bzip2算法来压缩/解压。

tar.xz格式

方式一:利用已经打包好的tar文件,直接用压缩命令:

压缩:xz [原文件名].tar

解压:unxz [原文件名].tar.xz

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -Jcvf [目标文件名].tar.xz [原文件名/目录名]

解压并解包: tar -Jxvf [原文件名].tar.xz

注:大写J代表用xz算法来压缩/解压。

tar.Z格式(已过时)

方式一:利用已经打包好的tar文件,直接用压缩命令:

压缩:compress [原文件名].tar

解压:uncompress [原文件名].tar.Z

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -Zcvf [目标文件名].tar.Z [原文件名/目录名]

解压并解包: tar -Zxvf [原文件名].tar.Z

注:大写Z代表用ncompress算法来压缩/解压。另,ncompress是早期Unix系统的压缩格式,但由于ncompress的压缩率太低,现已过时。

jar格式

压缩:jar -cvf [目标文件名].jar [原文件名/目录名]

解压:jar -xvf [原文件名].jar

注:如果是打包的是Java类库,并且该类库中存在主类,那么需要写一个META-INF/MANIFEST.MF配置文件,内容如下:

Manifest-Version: 1.0

Created-By: 1.6.0_27 (Sun Microsystems Inc.)

Main-class: the_name_of_the_main_class_should_be_put_here

然后用如下命令打包:

jar -cvfm [目标文件名].jar META-INF/MANIFEST.MF [原文件名/目录名]

这样以后就能用“java -jar [文件名].jar”命令直接运行主类中的public static void main方法了。

7z格式

压缩:7z a [目标文件名].7z [原文件名/目录名]

解压:7z x [原文件名].7z

注:这个7z解压命令支持rar格式,即:

7z x [原文件名].rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值