Linux 之打包备份命令 tar 详解

文章
林里克斯

Linux 之打包备份命令 tar 详解


实验平台:CentOS Linux release 7.6.1810 (Core)

tar Version:tar (GNU tar) 1.26



一、参数详解

$ tar --help

示例:
  tar -cf archive.tar foo bar  #将 foo bar 文件打包至 archive.tar 包
  tar -tvf archive.tar         #详细列出 archive.tar 包中的所有文件
  tar -xf archive.tar          #从 archive.tar 中解压所有文件

参数详解:

    主运行模式

  -A, --catenate, --concatenate   #合并 2 个 tar 包
  -c, --create               #创建一个新的 tar 包
  -d, --diff, --compare      #找出 tar 包系统和文件系统之间的差异,对比 tar 包内和文件系统上的文件的差异
      --delete               #从 tar 包中删除
  -r, --append               #将文件追加到 tar 包的末尾
  -t, --list                 #列出 tar 包的内容
      --test-label           #测试 tar 包卷标并退出
  -u, --update               #仅在 tar 包中附加比复制更新的文件
  -x, --extract, --get       #从 tar 包中提取文件,解压文件

 操作修饰符:

      --check-device         #创建增量时检查设备编号

  -g, --listed-incremental=FILE   #处理新的 GNU 格式增量备份
  -G, --incremental          #处理旧的GNU格式增量备份
      --ignore-failed-read   #对不可读文件不使用非零值退出
      --level=NUMBER         #已创建的列表-增量 tar 包的转储级别
  -n, --seek                 #
      --no-check-device      #创建时不检查设备编号增量档案
      --no-seek              #存档不可用
      --occurrence[=NUMBER]  process only the NUMBERth occurrence of each file
                             in the archive; this option is valid only in
                             conjunction with one of the subcommands --delete,
                             --diff, --extract or --list and when a list of
                             files is given either on the command line or via
                             the -T option; NUMBER defaults to 1
      --sparse-version=MAJOR[.MINOR]
                             set version of the sparse format to use (implies
                             --sparse)
  -S, --sparse               #倘若一个文件内含大量的连续 0 字节,则将此文件存成稀疏文件

 覆写控制:

  -k, --keep-old-files       #解 tar 包时不替换现有文件
      --keep-directory-symlink   #在提取情况下保留指向目录的现有符号链接。
      --keep-newer-files     #不替换更新于的现有文件。他们的存档副本
      --no-overwrite-dir     #保留现有目录的元数据
      --overwrite            #解压时覆盖现有文件
      --overwrite-dir        #在以下情况下覆盖现有目录的元数据。提取(默认)
      --recursive-unlink     #解压缩目录之前清空层次结构
      --remove-files         #将文件添加到 tar 包后将其删除
      --skip-old-files       #解压时不要替换现有文件,默默地跳过它们
  -U, --unlink-first         #在提取之前删除每个文件
  -W, --verify               #写入备份文件后,确认文件正确无误

 选择输出流:

      --ignore-command-error #忽略退出代码
      --no-ignore-command-error   #将非零退出代码视为错误
  -O, --to-stdout            #将文件提取到标准输出
      --to-command=COMMAND   #通过管道将提取的文件传送到另一个程序

 文件属性的处理:

      --atime-preserve[=METHOD]   #保留转储文件的访问时间
      --delay-directory-restore   #延迟设置修改时间和提取目录的权限直到结束
      --group=NAME           #强制 NAME 作为添加文件的组
      --mode=CHANGES         #强制(符号)模式更改已添加文件
      --mtime=DATE-OR-FILE   #为 DATE-OR-FILE 中添加的文件设置 mtime
  -m, --touch                #还原文件时,不变更文件的更改时间
      --no-delay-directory-restore
                             #取消 --DELAY-DIRECTORY-RESTORE 的效果
      --no-same-owner        #自己解压文件(默认为普通用户)
      --no-same-permissions  #在提取权限时应用用户的umask。来自存档(普通用户默认)
      --numeric-owner        #用户/组名称始终使用数字
      --owner=NAME           #强制将名称作为已添加文件的所有者
  -p, --preserve-permissions, --same-permissions
                             #提取有关文件权限的信息,用原来的文件权限还原文件。(超级用户默认)
      --preserve             #与 -p 和 -s 相同
      --same-owner           #尝试提取所有权与相同的文件。存在于存档中(超级用户默认)
  -s, --preserve-order, --same-order
                             #成员参数的列出顺序。存档中的文件

 扩展文件属性的处理:

      --acls                 #启用 POSIX ACL 支持
      --no-acls              #禁用 POSIX ACL 支持
      --no-selinux           #禁用 SELinux 上下文支持
      --no-xattrs            #禁用扩展属性支持
      --selinux              #启用 SELinux 上下文支持
      --xattrs               #启用扩展属性支持
      --xattrs-exclude=MASK  #指定 xattr 键的排除模式
      --xattrs-include=MASK  #指定 xattr 键的包含模式

 设备选择和切换:

  -f, --file=ARCHIVE         #指定 tar 包名字
      --force-local          #归档文件是本地的,即使它有冒号。tar 包有冒号时,直接解压会报错,需要加上此参数。
  -F, --info-script=NAME, --new-volume-script=NAME
                             #每次更换磁带时,就执行指定的Script文件,隐含 -M
  -L, --tape-length=NUMBER   #设置存放每体的容量,单位以 1024 Bytes 计算
  -M, --multi-volume         #创建/列出/提取多卷归档,还原备份文件或列出其中的内容时,采用多卷册模式
      --rmt-command=COMMAND  #使用给定的 RMT 命令代替 RMT
      --rsh-command=COMMAND  #使用远程命令而不是 rsh
      --volno-file=FILE      #使用/更新文件中的卷号

 装置封锁:

  -b, --blocking-factor=BLOCKS   #设置每笔记录的区块数目,每个区块大小为 12Bytes
  -B, --read-full-records    #阅读时重新阻塞(对于4.2BSD管道)
  -i, --ignore-zeros         #忽略备份文件中的 0 Byte 区块,也就是EOF
      --record-size=NUMBER   #每条记录的字节数,为 512 的倍数

 存档格式选择:

  -H, --format=FORMAT        #创建给定格式的档案

 FORMAT is one of the following:

    gnu                      GNU tar 1.13.x format
    oldgnu                   GNU format as per tar <= 1.12
    pax                      POSIX 1003.1-2001 (pax) format
    posix                    same as pax
    ustar                    POSIX 1003.1-1988 (ustar) format
    v7                       old V7 tar format

      --old-archive, --portability
                             same as --format=v7
      --pax-option=keyword[[:]=value][,keyword[[:]=value]]...
                             control pax keywords
      --posix                same as --format=posix
  -V, --label=TEXT           #建立使用指定的卷册名称的备份文件
 Compression options:

  -a, --auto-compress        #使用存档后缀确定压缩率
  -I, --use-compress-program=PROG
                             #通过PROG过滤(必须接受-d)
  -j, --bzip2                #通过 bzip2 打包 ($ tar -cjf busybox.tar.bz2 busybox)
  -J, --xz                   #通过 xz 打包
      --lzip                 #通过 lzip 打包
      --lzma                 #通过 lzma 打包
      --lzop
      --no-auto-compress     #不要使用后缀来确定 tar 包格式
  -z, --gzip, --gunzip, --ungzip   #通过 gzip 指令处理 tar 包
  -Z, --compress, --uncompress   #通过 compress (压缩)指令处理 tar 包

 Local file selection:

      --add-file=FILE        #将给定的FILE添加到存档中(如果其名称有用,以短划线开头)
      --backup[=CONTROL]     #备份之前删除,选择版本 CONTROL
  -C, --directory=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   排除目录下的所有内容包含文件
      --exclude-vcs          #排除版本控制系统目录
  -h, --dereference          #跟踪符号链接;存档并转储它们。
      --hard-dereference     #遵循硬链接;存档并转储他们的文件
  -K, --starting-file=MEMBER-NAME
                             #从成员 MEMBER-NAME 开始阅读
      --newer-mtime=DATE     #比较仅更改数据时的日期和时间
      --no-null              #禁用前一个 --null 选项的效果
      --no-recursion         #避免在目录中自动下降
      --no-unquote           #不要取消引用用 -T 读取的文件名
      --null                 #-T 读取以空值结尾的名称,禁用 -C
  -N, --newer=DATE-OR-FILE, --after-date=DATE-OR-FILE
                             #仅存储更新于日期或文件的文件
      --one-file-system      #创建归档时保留在本地文件系统中
  -P, --absolute-names       #文件名使用绝对名称,不移除文件名称前的 "/" 号
      --recursion            #递归到目录中(默认)
      --suffix=STRING        #删除前备份,覆盖通常的后缀('~'除非被环境变量覆盖)
  -T, --files-from=FILE      #指定范本文件,其内含有一个或多个范本样式,让 tar 解开或建立符合设置条件的文件
      --unquote              #用 -T 读取的无引号文件名(默认)
  -X, --exclude-from=FILE    #指定范本文件,其内含有一个或多个范本样式,让 tar 排除符合设置条件的文件

 File name transformations:

      --strip-components=NUMBER   strip NUMBER leading components from file
                             names on extraction
      --transform=EXPRESSION, --xform=EXPRESSION
                             use sed replace EXPRESSION to transform file
                             names

 File name matching options (affect both exclude and include patterns):

      --anchored             patterns match file name start
      --ignore-case          ignore case
      --no-anchored          patterns match after any `/' (default for
                             exclusion)
      --no-ignore-case       case sensitive matching (default)
      --no-wildcards         verbatim string matching
      --no-wildcards-match-slash   wildcards do not match `/'
      --wildcards            use wildcards (default)
      --wildcards-match-slash   wildcards match `/' (default for exclusion)

 Informative output:

      --checkpoint[=NUMBER]  display progress messages every NUMBERth record
                             (default 10)
      --checkpoint-action=ACTION   execute ACTION on each checkpoint
      --full-time            print file time to its full resolution
      --index-file=FILE      send verbose output to FILE
  -l, --check-links          print a message if not all links are dumped
      --no-quote-chars=STRING   disable quoting for characters from STRING
      --quote-chars=STRING   additionally quote characters from STRING
      --quoting-style=STYLE  set name quoting style; see below for valid STYLE
                             values
  -R, --block-number         #在每条消息中显示存档中的块号,列出每个信息在备份文件中的区块编号

      --show-defaults        #显示 tar 默认值
      --show-omitted-dirs    列出或提取时,列出每个目录与搜索条件不匹配
      --show-transformed-names, --show-stored-names
                             #转换后显示文件或档案名称
      --totals[=SIGNAL]      #处理档案后打印总字节数
      --utc                  #UTC中的打印文件修改时间
  -v, --verbose              #详细列出已处理的文件
      --warning=KEYWORD      #警告控制
  -w, --interactive, --confirmation
                             #遭遇问题时先询问用户
 Compatibility options:

  -o                         创建时,与 --old-archive 相同;和 --no-same-owner 相同

 Other options:

  -?, --help                 #打印帮助信息
      --restrict             #禁止使用某些潜在有害的选项
      --usage                #简短说明
      --version              #打印版本信息

二、使用详解


1.将文件追加到 tar 包里 (-r)

$ tar -cf test.tar test
$ tar -tvf test.tar
drwxr-xr-x jarbo/jarbo       0 2021-02-05 10:54 test/
-rw-rw-r-- jarbo/jarbo       0 2021-02-05 10:46 test/1.txt
-rw-rw-r-- jarbo/jarbo   20480 2021-02-05 10:53 test/2.txt
$ tar -rf test.tar busybox
$ tar -tvf test.tar
drwxr-xr-x jarbo/jarbo       0 2021-01-05 15:49 busybox/sysklogd/
-rw-r--r-- jarbo/jarbo    1706 2020-12-30 00:46 busybox/sysklogd/syslogd_and_logger.c
-rw-r--r-- jarbo/jarbo    8323 2020-12-30 00:46 busybox/sysklogd/klogd.c
-rw-r--r-- jarbo/jarbo     133 2021-01-05 15:48 busybox/sysklogd/.lib.a.cmd
-rw-r--r-- jarbo/jarbo   18348 2020-12-30 00:46 busybox/LICENSE
-rw-r--r-- jarbo/jarbo    7708 2020-12-30 00:46 busybox/Makefile.flags
drwxr-xr-x jarbo/jarbo       0 2021-01-05 15:49 busybox/docs/
···

2.将 2tar 包合并 (-A)

$ tar -tvf test.tar
drwxr-xr-x jarbo/jarbo       0 2021-02-05 10:54 test/
-rw-rw-r-- jarbo/jarbo       0 2021-02-05 10:46 test/1.txt
-rw-rw-r-- jarbo/jarbo   20480 2021-02-05 10:53 test/2.txt
$ tar -Af test.tar busybox.tar 
$ tar -tvf test.tar
drwxr-xr-x jarbo/jarbo       0 2021-01-05 15:49 busybox/sysklogd/
-rw-r--r-- jarbo/jarbo    1706 2020-12-30 00:46 busybox/sysklogd/syslogd_and_logger.c
-rw-r--r-- jarbo/jarbo    8323 2020-12-30 00:46 busybox/sysklogd/klogd.c
-rw-r--r-- jarbo/jarbo     133 2021-01-05 15:48 busybox/sysklogd/.lib.a.cmd
-rw-r--r-- jarbo/jarbo   18348 2020-12-30 00:46 busybox/LICENSE
-rw-r--r-- jarbo/jarbo    7708 2020-12-30 00:46 busybox/Makefile.flags
drwxr-xr-x jarbo/jarbo       0 2021-01-05 15:49 busybox/docs/
···

-A-r 参数区别:tar -A 需要 2 个原有 tar 包. tar -r 需要一个原有存档保存到另外一个原有存档的结尾处.

3.解压 bz2 压缩包

$ tar -xjf busybox-1.33.0.tar.bz2 
tar (child): bzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
#解压 bz2 压缩包需要依赖 bzip2

安装 bzip2

$ sudo yum -y install bzip2

解压

$ tar -xjf busybox-1.33.0.tar.bz2
#不会再报错
或
$ bzip2 -d busybox-1.33.0.tar.bz2
$ bunzip2 busybox-1.32.1.tar.bz2
#也需要安装 bzip2 才可以,这种方式会将原有的 bz2 压缩包解压为一个 tar 包,再使用 tar xf 来解压

4.解压 tar 包报错 resolve failed 的解决方法

$ tar xf db_backup_2020-09-23T06:13:27Z.tgz
tar: Cannot connect to db_backup_2020-09-23T06: resolve failed
#由于压缩文件名字里面有":",所以会被识别成一个地址

解决方法:加上参数 --force-local 来忽略冒号

$ tar xf db_backup_2020-09-23T06:13:27Z.tgz --force-local

Over~

版权协议须知!

本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

830 0 2021-02-05


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-05-02

今日天气
站点统计
  • 文章总数:240篇
  • 分类总数:29个
  • 评论总数:10条
  • 本站总访问量 217879 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!