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).实例

 打包文件夹(归档)

[[email protected] ~]$ 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 桌面 
[[email protected] ~]$ mkdir newDir 
[[email protected] ~]$ touch newDir/{1.txt,2.txt,3.txt} 
[[email protected] ~]$ tar -cvf newDir.tar newDir/ 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ 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 桌面 
[[email protected] ~]# tar -cvf grub.tar /boot/grub/  //也可以使用绝对路径 
tar: 从成员名中删除开头的“/”  //如果不去除根,解压时将会覆盖/boot/grub目录。去除根后将会在指定目录下解压出boot/grub/ 
/boot/grub/ 
/boot/grub/splash.xpm.gz

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

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

[[email protected] ~]$ tar -czvf newDir.tar.gz newDir 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ tar -cjvf newDir.tar.bz2 newDir 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ tar -cJvf newDir.tar.xz newDir 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ 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 桌面 

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

[[email protected] ~]$ 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 
[[email protected] ~]# 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 
[[email protected] ~]$ tar -tvfj newDir.tar.bz2   //-f后面跟有参数 
tar: j:无法 open: 没有那个文件或目录 
tar: Error is not recoverable: exiting now 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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

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

[[email protected] ~]$ rm newDir/1.txt   //删除文件夹下单独一个文件 
[[email protected] ~]$ tar -xzvf newDir.tar.gz newDir 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ 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 
[[email protected] ~]$ rm newDir/* 
[[email protected] ~]$ rmdir newDir/  //将整个newDir文件夹删除 
[[email protected] ~]$ tar -xjvf newDir.tar.bz2 newDir 
newDir/ 
newDir/1.txt 
newDir/2.txt 
newDir/3.txt 
[[email protected] ~]$ 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 桌面
//注意:文件夹名称不能变

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

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

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

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

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

[[email protected] ~]$ mkdir Dir 
[[email protected] ~]$ touch Dir/{t1,t2,t3} 
[[email protected] ~]$ tar --exclude Dir/t1 -zcvf Dir.test.tar.gz Dir 
Dir/ 
Dir/t2 
Dir/t3 
[[email protected] ~]$ 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 
[[email protected] ~]$ tar --exclude ./Dir/t1 -zcvf Dir.test2.tar.gz Dir  //加上'./'后反而无法生效 
Dir/ 
Dir/t1 
Dir/t2 
Dir/t3 
[[email protected] ~]$ 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 

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

[[email protected] ~]# 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。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/2901.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论