• Linux命令之tar


    tar [选项] [文件]

             tar将多个文件保存到单个磁带或磁盘存档中,并可以从存档中恢复单个文件。

      这里涉及到了归档和压缩,简单的来说,归档是将多个文件或文件夹打包成一个包文件(即存档);压缩是将文件通过特定算法减小文件大小的机制。在tar生成的包中以".tar"结尾文件是归档文件(即存档),以".tar.xx"结尾的文件是压缩包。

    (1).选项

    主操作模式(以下参数至少一个才可运行)

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

    常用的选项(用到比较多的选项,之后的选项可能会重复)

    -C,--directory=DIR 切换目录到DIR(一般用于指定解压位置)
    -f,--file=ARCHIVE 使用存档文件或ARCHIVE设备
    -j,--bzip2 通过bzip2过滤存档
    -J,--xz 通过xz过滤存档
    -p,--preserve-permissions 提取有关文件权限的信息(超级用户默认选项)
    -v,--verbose 详细列出已处理的文件
    -z,--gzip 通过gzip过滤存档

    操作修饰符:

    --check-device 创建增量存档时,检测设备编号(默认)
    --no-check-device 创建增量存档时不要检查设备编号
    -g,--listed-incremental=FILE 处理新的GNU格式增量备份
    -G,--incremental 处理旧的GNU格式增量备份
    --ignore-failed-read 当遇到不可读文件时不要以非零值退出
    --level-NUMBER 已创建的增量列表存档的输出级别
    -n,--seek 存档是可以检索的
    --no-seek 存档是不可检索的
    --occurrence[=NUMBER] 仅处理存档中每个文件的第NUMBER个事件;此选项仅在与命令--delete,--dif,--extract或--list中的一个连个使用时有效,并在命令行或通过-T选项提供文件列表。NUMBER默认为1。
    --sparse-version=MAJOR[.MINOR] 设置要使用的离散格式的版本(隐含--sparse)
    -S,--sparse 高效处理离散文件

    重写控制:

    -k,--keep-old-files 提取时不替换现有文件,将它们视为错误
    --keep-newer-files (解压/提取)不要替换比存档中新的现有文件
    --keep-directory-symlink 提取时不要将现有符号链接替换为目录
    --overwrite提取时重写现有文件
    --overwrite-dir 提取时重写现有目录的元数据
    --no-overwrite-dir保留现有目录的元文件
    --recursive-unlink 在提取目录之前清空目录层次结构
    --remove-files 将文件添加到存档后删除文件
    --skip-old-files 提取时不要替换现有文件,以静默方式跳过
    -U,--unlink-first 在提取覆盖之前删除那个文件
    -W,--verify 写入后尝试验证存档

    选择输出流:

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

    操作文件属性:

    --atime-preserve[=METHOD] 在输出的文件上保留访问时间,要么通过在读取(默认METHOD=’repalce’)后还原时间,要不就不要在第一次(METHOD=’system’)设置时间
    --delay-directory-restore 直到提取结束再设置提取目录的修改时间和权限
    --no-delay-directory-restore 取消--delay-directory-restore选项的效果
    --group=NAME 强制将NAME添加为文件的组
    --mode=CHANGES 强制将所添加的文件(符号)模式更改为权限CHANGES
    --mtime=DTAE-OR-FILE 从DATE-OR-FILE中为文件设置mtime
    -m,--touch 不提取文件的修改时间
    --numeric-owner 始终使用数字作为用户/组的名称
    --owner=NAME 强制NAME为添加文件的所有者
    -p,--preserve-permissions,--same-permissions 提取有关文件权限的信息(超级用户默认)
    --no-same-permissions 从存档中提取权限时使用用户的掩码位
    --preserve 与-p和-s一样
    --same-owner 尝试提取时保持所有者关系一致(超级用户默认)
    --no-same-owner 将文件解压为您所有(普通用户默认)
    -s,--preserve-order,--same-order 对要提取的名称进行排序以匹配存档

    处理扩展文件属性:

    --acls 启用POSIX ACLs支持
    --no-acls 禁用POSIX ACLs支持
    --selinux 启用SELinux环境支持
    --no-selinux 禁用SELinux 环境支持
    --xattrs 启用扩展属性支持
    --no-xattrs 禁用扩展属性支持
    --xattrs-exclude=MASK 指定扩展属性排除的模式
    --xattrs-include=MASK 指定扩展属性包含的模式

    设备选择和切换:

    -f,--file=ARCHIVE 使用存档文件或设备ARCHIVE
    --force-local 存档文件即使有冒号也是本地的
    -F,--info-script=NAME,--new-volume-script=NAME 在每卷磁带最后运行脚本(隐含-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*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格式,tar<=1.12
    	pax POSIX 1003.1-2001(pax)格式
    	posix 与pax相同
    	ustar POSIX 1003.1-1988(ustar)格式
    	v7 旧的v7 tar格式
    --old-archive,--portability 与--format=v7相同
    --pax-option=keyword[[:]=value][,keyword[[:]=value]]… 控制pax关键字
    --posix 与--format=posix相同
    -V,--label=TEXT 使用卷名TEXT创建存档;在列出/提取时,使用TEXT作为卷名的通配模式。

    压缩选项:

    -a,--auto-compress 使用存档后缀来确定压缩程序
    --no-auto-compress 不使用存档后缀来确定压缩程序
    -l,--use-compress-program=PROG 通过PROG过滤(必须能接受-d选项的程序)
    -j,--bzip2 通过bzip过滤存档
    -J,--xz 通过xz过滤存档
    --lzip 通过lzip过滤存档
    --lzma 通过lzma过滤存档
    --lzop 通过lzop过滤存档(?)
    -z,--gzip,--gunzip,--ungzip 通过gzip过滤存档
    -Z,--compress,--uncompress 通过compress过滤存档
    注意:你可能需要安装外部程序(lzip/ncompress/lzma…)才能使用其中一些压缩选项

    本地文件选择:

    --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-all=FILE 排除包含FILE的目录
    --exclude-tag-under=FILE 排除包含FILE的目录下所有内容
    --exclude-vcs 排除版本控制系统目录
    -h,--dereference 跟踪符号链接;将它们所指向的文件存档并输出
    --hard-dereference 跟踪硬链接;将它们所指向的文件存档并输出
    -K,--starting-file=MEMBER_NAME 从存档中MEMBER_NAME成员处开始
    --newer-mtime=DATE 只有当数据被更改时,比较数据和时间
    --null -T读取以空为结尾的名字,-C禁用
    --no-null 禁用上一个--null选项效果
    -N,--newer=DATE-OR-FILE,--after-date=DATE-OR-FILE 仅存储比DATE-OR-FILE新的文件
    --one-file-system 创建存档时保留在本地文件系统中
    -P,--absolute-names 不用从文件名中删除引导符’/’
    --recursion 递归目录(默认)
    --no-recursion 避免目录中的自动降级
    --suffix=STRING 在删除前备份,除非被环境变量SIMPLE_BACKUP_SUFFIX覆盖,否则覆盖常用后缀’~’
    -T,--files-from=FILE 从FILE中获取文件名来解压或创建文件
    --unquote 用-T读取的文件名作为引用结尾(默认)
    --no-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 使用通配符(默认)
    --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中的字符引用
    --quto-chars=STRING 加之STRING中的字符引用
    --quoting-style=STYLE 设置名称引用样式;有效的STYLE值有literal、shell、shell-always、c、c-maybe、escape、locale、clocale
    -R,--block-number 每个信息都显示存档内的块数
    --show-defaults 显示tar默认选项
    --show-omitted-dirs 列出或解压时,将与搜索条件不匹配的目录列出
    --show-transformed-names,--show-stored-names 转换后显示文件或存档名称
    --totals[=SIGNAL] 处理存档后打印出总字节数;当此SIGNAL被触发时带参数 - 打印总字节数;运行的信号为:SIGHUP,SIGQUIT,SIGINT,SIGUSR1和SIGSUR2;同时也接收不带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   总是使用简单备份

    (2).实例

     打包文件夹(归档)

    [xf@xuexi ~]$ ls -l
    总用量 0
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
    [xf@xuexi ~]$ mkdir newDir
    [xf@xuexi ~]$ touch newDir/{1.txt,2.txt,3.txt}
    [xf@xuexi ~]$ tar -cvf newDir.tar newDir/
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ ls -l
    总用量 12
    drwxrwxr-x. 2 xf xf    45 11月 29 13:19 newDir
    -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf     6 11月 19 13:29 桌面
    [root@xuexi ~]# tar -cvf grub.tar /boot/grub/  //也可以使用绝对路径
    tar: 从成员名中删除开头的“/”  //如果不去除根,解压时将会覆盖/boot/grub目录。去除根后将会在指定目录下解压出boot/grub/
    /boot/grub/
    /boot/grub/splash.xpm.gz

    注意:使用绝对路径归档文件时,将默认从路径中删除根,这样解压时会解压到当前目录。如果不移除根,解压时按绝对路径来释放,会覆盖原系统中此路径的文件。

    以gzip,bzip2和zx格式打包并压缩文件夹

    [xf@xuexi ~]$ tar -czvf newDir.tar.gz newDir
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ tar -cjvf newDir.tar.bz2 newDir
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ tar -cJvf newDir.tar.xz newDir
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ ls -l
    总用量 24
    drwxrwxr-x. 2 xf xf    45 11月 29 13:19 newDir
    -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar
    -rw-rw-r--. 1 xf xf   169 11月 29 13:24 newDir.tar.bz2  //bzip2格式的压缩包
    -rw-rw-r--. 1 xf xf   159 11月 29 13:24 newDir.tar.gz  //gzip格式的压缩包
    -rw-rw-r--. 1 xf xf   196 11月 29 13:25 newDir.tar.xz  //xz格式的压缩包
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf     6 11月 19 13:29 桌面
    

    列出上述归档/压缩包包含的文件,用什么格式压缩,就要用什么格式过滤

    [xf@xuexi ~]$ tar -tvf newDir.tar
    drwxrwxr-x xf/xf             0 2018-11-29 13:19 newDir/
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/1.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/2.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/3.txt
    [root@xuexi ~]# tar -tvf grub.tar 
    drwxr-xr-x root/root 0 2018-12-09 15:33 boot/grub/
    -rw-r--r-- root/root 1350 2011-11-16 05:03 boot/grub/splash.xpm.gz
    [xf@xuexi ~]$ tar -tvfj newDir.tar.bz2   //-f后面跟有参数
    tar: j:无法 open: 没有那个文件或目录
    tar: Error is not recoverable: exiting now
    [xf@xuexi ~]$ tar -tjvf newDir.tar.bz2 
    drwxrwxr-x xf/xf             0 2018-11-29 13:19 newDir/
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/1.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/2.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/3.txt
    [xf@xuexi ~]$ tar -tJvf newDir.tar.xz 
    drwxrwxr-x xf/xf             0 2018-11-29 13:19 newDir/
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/1.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/2.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/3.txt
    [xf@xuexi ~]$ tar -tzvf newDir.tar.gz 
    drwxrwxr-x xf/xf             0 2018-11-29 13:19 newDir/
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/1.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/2.txt
    -rw-rw-r-- xf/xf             0 2018-11-29 13:19 newDir/3.txt

    提取归档/压缩包,一样需要使用相同格式过滤

    [xf@xuexi ~]$ rm newDir/1.txt   //删除文件夹下单独一个文件
    [xf@xuexi ~]$ tar -xzvf newDir.tar.gz newDir
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ ls -l newDir/  //1.txt又出现了
    总用量 0
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 1.txt
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 2.txt
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 3.txt
    [xf@xuexi ~]$ rm newDir/*
    [xf@xuexi ~]$ rmdir newDir/  //将整个newDir文件夹删除
    [xf@xuexi ~]$ tar -xjvf newDir.tar.bz2 newDir
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ ls -l
    总用量 24
    drwxrwxr-x. 2 xf xf    45 11月 29 13:19 newDir  //提取压缩包后又出现了
    -rw-rw-r--. 1 xf xf 10240 11月 29 13:19 newDir.tar
    -rw-rw-r--. 1 xf xf   169 11月 29 13:24 newDir.tar.bz2
    -rw-rw-r--. 1 xf xf   159 11月 29 13:24 newDir.tar.gz
    -rw-rw-r--. 1 xf xf   196 11月 29 13:25 newDir.tar.xz
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf     6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf     6 11月 19 13:29 桌面
    //注意:文件夹名称不能变

    如果想要解压到指定的文件夹下,又该如何

    [xf@xuexi ~]$ mkdir newDir2
    [xf@xuexi ~]$ tar -xJvf newDir.tar.xz newDir2  //直接操作会发现报错
    tar: newDir2:归档中找不到
    tar: 由于前次错误,将以上次的错误状态退出
    [xf@xuexi ~]$ tar -xJvf newDir.tar.xz -C newDir2  //这时使用-C切换一下目录,发现可以提取了
    newDir/
    newDir/1.txt
    newDir/2.txt
    newDir/3.txt
    [xf@xuexi ~]$ ls -l newDir2
    总用量 0
    drwxrwxr-x. 2 xf xf 45 11月 29 13:19 newDir
    [xf@xuexi ~]$ ls -l newDir2/newDir/
    总用量 0
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 1.txt
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 2.txt
    -rw-rw-r--. 1 xf xf 0 11月 29 13:19 3.txt
    

    如果只想提取其中一个或几个文件,需要进行什么操作

    [xf@xuexi ~]$ rm newDir/*
    [xf@xuexi ~]$ tar -zxvf newDir.tar.gz newDir/1.txt  //如果多个文件则使用大括号“{}”包裹文件名,文件名之间用逗号“,”隔开
    newDir/1.txt
    

    打包(归档)时不包含指定目录下的文件

    [xf@xuexi ~]$ mkdir Dir
    [xf@xuexi ~]$ touch Dir/{t1,t2,t3}
    [xf@xuexi ~]$ tar --exclude Dir/t1 -zcvf Dir.test.tar.gz Dir
    Dir/
    Dir/t2
    Dir/t3
    [xf@xuexi ~]$ tar -ztvf Dir.test.tar.gz 
    drwxrwxr-x xf/xf             0 2018-11-29 15:26 Dir/
    -rw-rw-r-- xf/xf             0 2018-11-29 15:26 Dir/t2
    -rw-rw-r-- xf/xf             0 2018-11-29 15:26 Dir/t3
    [xf@xuexi ~]$ tar --exclude ./Dir/t1 -zcvf Dir.test2.tar.gz Dir  //加上'./'后反而无法生效
    Dir/
    Dir/t1
    Dir/t2
    Dir/t3
    [xf@xuexi ~]$ tar -ztvf Dir.test2.tar.gz 
    drwxrwxr-x xf/xf             0 2018-11-29 15:26 Dir/
    -rw-rw-r-- xf/xf             0 2018-11-29 15:26 Dir/t1
    -rw-rw-r-- xf/xf             0 2018-11-29 15:26 Dir/t2
    -rw-rw-r-- xf/xf             0 2018-11-29 15:26 Dir/t3
    

    打包多个不同的文件夹或文件

    [root@xuexi ~]# tar -cvf back.tar /boot/grub CentOS-Base.repo /etc/passwd  //可以看到,正常打包即可
    tar: 从成员名中删除开头的“/”
    /boot/grub/
    /boot/grub/splash.xpm.gz
    CentOS-Base.repo
    /etc/passwd
    

    (3).扩展

    压缩比例越高,压缩时间越长,压缩文件越小。压缩比例:xz>bz2>gz>tar。

  • 相关阅读:
    龟兔赛跑(动态规划)
    Dividing (多重背包 搜索)
    第k大值01背包问题
    FATE(完全背包)
    01背包 和 完全背包 详解
    放苹果(动态规划)
    max Sum(简单动态规划)
    连连看 优先对列 应用2
    尺取法
    Square(强大的剪枝)
  • 原文地址:https://www.cnblogs.com/diantong/p/10033005.html
Copyright © 2020-2023  润新知