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。

posted @ 2018-11-29 15:33  苦逼运维  阅读(5610)  评论(0编辑  收藏  举报