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。