开源归档工具-tar
2013-05-25 22:00:17 阿炯

类Unix系统上的用于压缩的打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为"tar",注意它本身并不能压缩。目前tar文件格式已经成为POSIX标准,为POSIX.1-2001。本程序最初的设计目的是将文件备份到磁带上(tape archive),因而得名tar。


Tar archiving is often used together with a compression method, such as gzip, to create a compressed archive. As shown, the combination of the files in the archive are compressed as one unit.

常用的tar是自由软件基金会开发的GNU版,目前的稳定版本是1.26,发布于2011年,同时它有多个压缩率不同的版本,如tar.xz和tar.gz。.tar代表未被压缩的tar文件,已被压缩的tar文件则追加压缩文件的扩展名,如经过gzip压缩后的tar文件,扩展名为“.tar.gz”。由于受到DOS8.3文件名格式的限制,常使用下列缩写:
.tgz等价于.tar.gz
.tbz与tb2等价于.tar.bz2
.taz等价于.tar.Z
.tlz等价于.tar.lzma
.txz等价于.tar.xz

由于备份策略的进步,逐渐采用dump、restore等工具替代tar。tar多与gzip联用,这一用法沿用至今,新的tar版本已能自动调用多种压缩工具执行压缩。已压缩的tar文件也叫“tarball”,大部分自由软件的源代码采用tarball的形式发布。


tar管道用法
tar -c "${源目录}" | tar -xvC "${目标目录}"

文件默认是标准输入/输出,不需再额外指定。可以将源目录下的文件及子目录复制到目标目录中,尤其适用于复制含有特殊文件(如软链接、设备文件)的目录。

功能
 -c,--create 创建新的tar文件
 -x,--extract,--get 解开tar文件
 -t,--list 列出tar文件中包含的文件的信息
 -r,--append 附加新的文件到tar文件中
 -u,--update 用已打包的文件的较新版本更新tar文件
 -A,--catenate,--concatenate 将tar文件作为一个整体追加到另一个tar文件中
 -d,--diff,--compare 将文件系统里的文件和tar文件里的文件进行比较
 --delete 删除tar文件里的文件。注意,这个功能不能用于已保存在磁带上的tar文件!

常用选项
 -v,--verbose 列出每一步处理涉及的文件的信息,只用一个“v”时,仅列出文件名,使用两个“v”时,列出权限、所有者、大小、时间、文件名等信息。
 -k,--keep-old-files 不覆盖文件系统上已有的文件
 -f,--file [主机名:]文件名 指定要处理的文件名。可以用“-”代表标准输出或标准输入。
 -P,--absolute-names 使用绝对路径
 -j,--bzip2 调用bzip2执行压缩或解压缩。注意,由于部分老版本的tar使用-I实现本功能,因此,编写脚本时,最好使用--bzip2。
 -z,--gzip,--gunzip,--ungzip 调用gzip执行压缩或解压缩
-Z,--compress,--uncompress 调用compress执行压缩或解压缩


tar命令的选项有很多(用man tar可以查看到) 。

格式:tar [主选项+辅选项] 文件或目录

主选项:它们不可能同时出现,告诉tar要做什么事,是必须要有的
-c:创建新的压缩文件,相当与打包
-x:从压缩文件中释放文件,相当于拆包
-t:列出压缩文件中的内容

辅选项:可选
-C:切换到指定目录
-z:是否同时具有gzip的属性?亦即是否需要用gzip压缩或解压?一般格式为gz或xx.tgz
-j:是否同时具有bzip2的属性?亦即是否需要用bzip2压缩或解压?一般格式为bz2
-v:压缩过程中显示文件
-f:指定压缩文件,注意,在f之后要立即接档名(自取的),不要再加其他参数
-p:使用原文件的原来属性
-exclude FILE:在压缩过程中,不要将FILE打包

常用命令:

压缩:
tar -cvf 文件或目录名 打包的对象--仅打包,不压缩
tar -zcvf 文件或目录名--打包后,以gzip压缩
tar -jcvf 文件或目录名--打包后,以bzip2压缩

查阅:(注意:根据是否为gzip压缩,来选择是否要加上z)

tar -ztvf 文件或目录名 ——查阅压缩文件中有那些文件

解压:
tar -xvf 文件或目录名
tar -zxvf 文件或目录名

示例:

tar -cvf file2.tar /home/user2/file2
#将/home/user2/file2文件打包到当前目录下的tar中,需要注意的是:使用绝对路径标识的源文件,在用tar命令压缩后,文件名连同绝对路径(home/user2/,根目录'/'被自动去掉了)一并被压缩进来,使用tar解压缩后会看到home文件,二并不是file2。

tar -cvf file2.tar -C /home/user2/file2 #使用-C命令,将tar的工作目录从当前目录改为/home/user2,将file2文件(不带绝对路径)压缩到tar中。注意:-C dir的作用在于改变工作目录,其有效期为该命令中下一次-C dir之前。

tar -xvf file2.tar -C /home/user2/file2 #将文件解压到指定目录路径下。

tar除了最基本的打包功能外,还可以在打包或解包的同时调用其他压缩软件,比如gzip、bzip2等。

tar调用gzip

gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。

解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

tar中使用-z这个参数来调用gzip。

tar -czf all.tar.gz *.jpg #这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为gz
tar -xzf all.tar.gz #这条命令是将上面产生的包解开。

另外,如果遇到.tgz文件,操作方式相同,.tgz是.tar.gz的缩写。

tar调用bzip2

bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。 与bzip2相对的解压程序是bunzip2。

解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩:bzip2 -z FileName

tar中使用-j这个参数来调用gzip。

tar -cjf all.tar.bz2 *.jpg #这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为bz2
tar -xjf all.tar.bz2 #这条命令是将上面产生的包解开。

非常不常见的.bz文件也使用相同的方式进行解压缩。

tar调用compress

compress也是一个压缩程序,目前使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与 compress相对的解压程序是uncompress。

解压:uncompress FileName.Z
压缩:compress FileName

tar中使用-Z这个参数来调用compress。下面来举例说明一下:
tar -cZf all.tar.Z *.jpg #这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

tar -xZf all.tar.Z #这条命令是将上面产生的包解开


有关的问题
tar打包后中文文件名乱码
7zip和rar会记录字符集,自动转换,而tar不会
比如"中国.txt",utf-8下编码是e4b8ade59bbd,tar里面记录的是e4b8ade59bbd.tar,然后gbk下中国不是e4b8ade59bbd,所以就是乱码了;zip也不保存字符集,这个是算法结构里面的,所以要支持也要改zip的源码。

解决办法:
在linux下来使用rar或者7zip处理中文文件名的文件

归根结底是因为linux和windows字符集设置得不同,windows的机制是本地编码来记录文件名,本地编码的字符集是跟Locale(多语种支持)相关的,而Locale又跟你安装系统所选区域语言有关,由此,windows当前所用的字符编码的,与linux的字符编码不一致,且中文的编码就有很多种,如果两个对应系统的字符编码设置为相同也许能解决这个问题。

更多使用方式请参考:tar命令用法示例


最新版本:1.2


项目主页:http://www.gnu.org/software/tar/