Linux tar命令详解
Linux tar命令
tar命令介绍
tar命令是linux上将 多个文件打包程一个文件包。方便传输,也可以用于文件备份。我们也可以用tar来解压归档文件。
tar命令压缩格式
tar命令支持的压缩格式,一般我们在使用tar命令的时候会同时对文件压缩,以降低空间使用率。通常我们会采用以下命名规范来约定我们使用了哪种压缩方式。
.tar 默认模式,不压缩,只是将所有文件放到一个包里。
.tar.gz 常用模式,采用gzip算法压缩。压缩率一般,压缩时间中等。
.tar.bz2 不常用。采用bz2算法压缩。压缩率稍差,压缩时间较短。
.tar.xz 不常用,采用xz算法压缩。压缩率较好,压缩时间较长。
tar概要简介
tar语法介绍
tar 一般支持以下两种语法格式,第二种是旧的方式。
tar OPTION... [NAME]...
tar LETTER... [ARGUMENT]... [OPTION]... [NAME]...
tar的主要参数,我们称之为【操作类型】:例如,c创建,x解压。其他的参数我们称之为【附加选项】,用来改变我们操作的进展方式例如文件名字,待归档的目标文件。
主要参数 【操作类型】一定要放在最前方。
两种语法格式中的[NAME]都是指明我们要待归档的文件名字,[NAME]可以是文件或者目录,或者是多个文件或目录。 [NAME]一定要指定明确,而且在我们执行tar命令之前一定是要已经存在与文件系统上。
tar的其他知识介绍
tar "将相对路径的文件名解释为相对目录。如果我们指定了绝对路径, tar会将首个/去掉来进行打包。这么做的目的是为了防止解压的时候替换掉系统目录。除非我们故意指定【--absolute-names】选项。
如果我们指定的是一个目录的话,tar会递归指定目录下所有的子目录和文件来进行归档,例如我们指定/,意思就是整个文件系统都将要被归档。
在使用shell通配符的时候区别文件名字和待归档成员是非常重要的。原因在于,shell只会对存在的文件使用通配符, tar自己也会对归档成员使用通配,所以我们必须保证通配符只针对tar起作用,而不是shell.通常我们可以使用反斜杠\在 "*"或“?”或者放在单引号中,这样旧可以了
通常我们都会把支队的文件放在命令行上,实际上我们也可以通过读文件的方式来指定归档后的文件名。'--files-from=FILE-OF-NAMES' ('-T FILE-OF-NAMES')
如果我们不指定归档后的文件名,那么 追加,删除,等操作命令不会做任何操作。create会输出一个诊断信息,并阻止tar操作。其他的操作选项会对整个archive目录操作
除了正常成功退出,tar会因为很多原因失败。有的情况是可以恢复的,例如当tar命令不是正常组织书写时,错误会推迟到直到文件处理完会报告出来。.有的错误可能不是故意的,但是还是有危险,那么接下来,tar会立即退出。
然而所有非正常的退出,不论是立即的还是推迟的,都会有错误输出,并且会有诊断信息。
可能的tar程序退出码有:0(正常退出),1(有文件发生变化了),2(严重错误,不可恢复的错误)
tar选项风格
三种选项风格
标准tar命令一共支持8种操作模式让我们去完成多样任务。每次使用tar命令我们只能选择一种操作模式。根据实际情况,我们可能会希望指定tar操作模式的运行。例如我们可能修改outputs的输出格式。或者我们想要文件格式需要我们去特殊指定操作顺序。
tar选项是在我们指定tar操作模式后附加的选项。根据tar的操作模式,我们可以指定一个或多个选项。不同的选项有不同的作用,通常情况下,选项会修改该操作模式具体内容。例如修改归档格式,归档文件名,或者用户交互级别。
有些选项对所有操作模式都会有效,有些选项只对特定的操作模式有效。我们会经常使用一些固定的选项。其他的可能很少用到,或基本不会用到。
选项是大小写敏感的,例如-T和-t是不同的,T要求一个参数名字来指明文件名或文件列表。t则不需要参数 ,是--list的另一种书写方式。
tar选项通常支持3中不同的风格: 长命名型(--),短命名型(-),旧命名方式(没有-)。操作模式或选项都可以使用任意一种风格。3中不同的风格是在不同的时期开发出来嘚。
有些选项是需要一个参数的,在哪里放置参数,通常的时候需要根据我们使用哪种风格。这些区别可能是微妙的,但是却很重要。选项放置在错误的位置,可能会导致覆盖一些重要的文件。我们必须要注意到这些不同点。而且只使用我们所了解的选项,直到我们对其他的选项也了解了。那些需要接收参数的选项,他们可能会有最长或短的形式,而没有旧风格的对应选项。使用这些需要指定参数的选项的规则是非常严谨的。
例如--file选项需要接收一个归档文件名作为参数。如果我们不指定归档文件名,tar会使用一个默认的但另我们困惑名字,建议我们一定要指定一个具体的归档文件名字。
长命名选项风格
tar所有的参数选项都至少有一个长命名型的参数。长命名参数选项比短命名和旧参数名字类型显示更加的清晰。有的时候长名字选项会有不同的名字但是却是相同的作用,例如--compare和--dif是同一个意思。另外长命名方式,也可以使用唯一的缩写,例如--create可以用--cre来代替。因为没有其他的选项以--cre开头。
tar 长命名选项更加的明显和容易记忆,而且他们的名字也容易辨认。例如 tar --create --verbose --blocking-factor=20 --file=/dev/rmt0,全部使用的是长命名型参数,可以显而易见的看出每个参数的含义。
长命名选项必须接收参数的话,要立即在该选项后面书写, 有两种方式去指定必须的参数,一种是使用空格,另一种是使用=符号。例如--file选项我们可以使用--file archive.tar 或者--file=archive.tar两种方式来制定参数。
对应地,如果选项可以接收也可以不接收参数的话。这种情况下如果要接收参数,必须使用=符号来指定。例如 --backup 可选接收参数。如果要指定的话,必须使用'--backup=BACKUP-TYPE'.
短命名选项风格
相对于长命名选项,短命名方式一个明显的优点就是书写很方便。
短命名选项如果需要在选项后面立即接收参数的话,通常以空格来实现。 也可以省略空格,立即接着选项书写,例如指定归档名字 我们可以使用-f archive.tar(有空格) -farchive.tar(省略空格),--file=archive.tar. -f ARCHIVE-NAME和--file=ARCHIVE-NAME都表示这个选项指定了归档文件名。
有可选参数的短命名选项,如果要指定参数的时候,需要参数紧跟短选项名字,不能使用任何空格。
短命名选项可以放在一起书写,但不是要求的。当短选项以集合成片出现时,仅在选项开始使用一个-,例如tar -cvf,同时只有最后一个选项允许接收必须参数。(将许多选项集中在一起,最后一个选项有一个参数,这是一种相当不透明的写法。)
当选项分开使用时,每个选项的参数需要紧跟着该选项。 tar -c -v -b 20 -f /dev/rmt0。如果参数没有调整好,可能会导致文件被覆盖。
当我们重新调整选项时,要注意同时移动属于该选项的参数。
旧选项风格
在旧选项风格中,但选项需要参数的时候,这些选项要一起提供,所有的选项按选项书写顺序提供。例如 tar -c -v -b 20 -f /dev/rmt0 要写成 tar cvbf 20 /dev/rmt0这里20是b选项的参数 /dev/rmnt0是f的参数。
我们可以看出,旧风格选项,匹配选项字母和对应的参数是很困难的,而且很容易令人困惑。短命名方式逗比旧命名方式要好很多。如果要调整选项的字母,必须要同时准确地调整对应的参数位置。
旧选项风格有的时候甚至可以震惊一个熟悉的用户。
tar cfz archive.tar.gz file 这个例子中 archive.tar.gz 被认为是f的参数,z是压缩选项。
tar -cfz archive.tar.gz file 这个例子中 z会被认为是f的选项值,尽管不是我们想的。
旧选项风格是为了向下兼容而保留的。而且很多用户已经习惯了这种方式。
第二个例子我们有几种方式来修改。
tar -czf archive.tar.gz file
tar -cf archive.tar.gz -z file
tar cf archive.tar.gz -z file
通常tar命令的第一个选项一般都会当做包含操作模式和选项来对待处理,尽管没有用-开始。因此 tar c与tar -c一样,都是和--create一样来创建归档。
混合选项风格
三种选项风格可以同时出现在一条tar 命令中,但是旧选项必须在tar命令后 第一个出现,现代风格的选项必须在旧选项集合输入之后出现,这个是必须遵守的原则,否则可能我们输入的命令跟我们预想的结果根本不一样。可能会造成严重的错误或灾难。
tar选项
操作模式
'--concatenate' '--catenate' '-A' 将其他归档文件放在当前归档文件末尾
'--append' ' -r' 追加文件到归档文件
'--compare' '--diff' '-d' 将归档文件和文件系统上的文件进行对比
'--create' '-c' 创建一个归档文件
'--delete' 从归档文件中删除一些文件。(不能在tape上操作)
'--extract' '--get' '-x' 提取归档文件到当前文件系统
'--list' '-t' 显示归档文件的组成文件列表
'--update' '-u' 更新归档文件中的某个文件,只有在该文件有更新时。或者不存在与归档文件。
通用选项
-C, --directory=DIR 改变工作目录。
-f, --file=ARCHIVE 指定归档文件名
-j, --bzip2 使用bzip2压缩方式过滤
-J, --xz 使用xz压缩方式过滤
-p, --preserve-permissions 解压时保留文件的权限。
-v, --verbose 详细的列出处理的文件
-z, --gzip 使用gzip压缩方式过滤
提取时覆盖选项
--remove-files 提取归档后删除归档文件
-k --keep-old-files 执行的时候不覆盖已经存在的文件,会输出错误
--keep-newer-files 执行的时候不覆盖比archive里文件新的文件
--keep-directory-symlink 不把已经存在的连接替换成目录
--no-overwrite-dir 保存已经存在的目录的原信息
--overwrite 覆盖已经存在的文件
--overwrite-dir 覆盖已经存在的目录
--recursive-unlink 在提取目录文件前清除该目录结构
--skip-old-files 不替换已经存在的文件。静默方式跳过
-U, --unlink-first 在提取之前先删除所有文件
-W, --verify 校验
处理文件的属性
--atime-preserve[=METHOD] 保存文件atime到归档文件
--delay-directory-restore 直到解压完才改变目录的时间戳属性
--group=NAME 强制修改文件所属组
--mode=CHANGES 强制连接模式修改
--mtime=DATE-OR-FILE 修改文件的mtime
-m, --touch 不提取文件的 mtime
--no-delay-directory-restore 取消delay-directory-restore
--no-same-owner extract files as yourself (default for ordinary users)
--no-same-permissions apply the user's umask when extracting permissions from the archive (default for ordinary users)
--numeric-owner 使用number来表示owner和group
--owner=NAME 修改归档的文件的owner
-p, --preserve-permissions, --same-permissions 保留文件的属性
--preserve 保留文件的属性 same as both -p and -s
--same-owner 保留文件的属性
-s, --preserve-order, --same-order 保留文件的属性
本地目录文件的选择
--add-file=FILE 最加文件到归档中如果一个文件名字以-开始
--backup[=CONTROL] 删除之前先备份
-C, --directory=DIR 修改工作目录到指定目录
--exclude=PATTERN 排除一些文件
--exclude-backups 排除掉 备份和锁文件
--exclude-caches 排除掉cache(CACHEDIR.TAG)的目录其他文件,除了tagfile
--exclude-caches-all 排除掉包括CACHEDIR.TAG的目录
--exclude-caches-under 排除掉所有有tagfile的目录的其他文件,但是有目录
--exclude-tag=FILE 排除掉指定含义某文件的目录,除了该文件
exclude contents of directories containing FILE, except for FILE itself
--exclude-tag-all=FILE exclude directories containing FILE 排除掉有某文件的整个目录
--exclude-tag-under=FILE 排除掉有某文件的目录里的所有内容
--exclude-vcs 排除掉vcs版本控制的目录
-h, --dereference 保存软连 ,将目标文件也归档起来
follow symlinks; archive and dump the files they point to
--hard-dereference 保存硬软连 ,将目标文件也归档起来
-K, --starting-file=MEMBER-NAME 以目录中某个文件开始归档,前面的文件不归档
--newer-mtime=DATE 当内容修改时,对比文件的日期和时间
-P, --absolute-names 以绝对路径来打包。提取时会覆盖源文件--recursion
--suffix=STRING 删除之前先备份,以设置的前缀来覆盖
-X, --exclude-from=FILE 排除掉指定文件里的约定的文件