曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3733|回复: 0
打印 上一主题 下一主题

tar -- 压缩/解压缩文件

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-4-9 19:56:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 通常用法
使用 -c 和 -f 选项打包,-c 选项表示创建一个打包文件,-f 选项指定一个包文件名:
# tar -cf teacher.tar teacher/
# ls -l
total 228
-rwxr--r-- 1 root root    552 2012-04-09 15:50 down.sh
drwxr-xr-x 2 root root   4096 2012-04-09 15:50 teacher
-rw-r--r-- 1 root root 225280 2012-04-09 17:27 teacher.tar
可以在一个命令行中给出多个要添加到压缩包的文件和目录,比如:
$ tar -cf mybox.tar file1 file2 dir1 dir2 ..
注意,-f 选项后面需要紧跟着要创建的包名。

2. 再添加文件到已存在的压缩包中
上面我们已经创建了一个 teacher.tar 压缩包,假设这时我们发现遗漏了一个文件还没添加进来,我们大可不必从头全部打包,tar 的 -r 选项可以实现“附加”功能,如:
# tar -rvf teacher.tar down.sh
down.sh

3. 使用 -t 选项查看压缩包里的文件
使用 -t 选项可以列出压缩包里的文件,比如我们可以利用该选项检查上面所附加的文件是否成功:
[qutoe]# tar -tf teacher.tar
teacher/
teacher/5715408995_1f13f5aa48_t.jpg
teacher/4711140313_ee5d697b7a_t.jpg
... ...
down.sh[/quote]
由输出可见,确实成功添加了 down.sh 这个文件到 teacher.tar 中。

4. 使用 -v 输出详细信息
-v 选项可以打印出许多打包或解包时的细节信息,比如:
# tar -tvf teacher.tar
drwxr-xr-x root/root         0 2012-04-09 15:50 teacher/
-rw-r--r-- root/root     19368 2012-04-09 15:50 teacher/5715408995_1f13f5aa48_t.jpg
-rw-r--r-- root/root      6397 2012-04-09 15:50 teacher/4711140313_ee5d697b7a_t.jpg
-rw-r--r-- root/root     17546 2012-04-09 15:50 teacher/5167263404_3993b64eae_t.jpg
... ...

5. 使用 -x 选项解提取包中文件
# tar -xf teacher.tar
# ls
down.sh  teacher  teacher.tar

6. 将 tar 用在标准输入和标准输出上
在打包文件时,也可以指定标准输出(stdout)为输出文件,即 -f 选项后接 - 符号(- 符号表示标准输出或标准输出),比如下面的例子:
# echo "hello world" > tmp1.txt
# echo "hello shell" > tmp2.txt
# echo "hello linux" > tmp3.txt
# ls
down.sh  teacher  teacher.tar tmp1.txt  tmp2.txt  tmp3.txt
# mkdir temp
# tar -cf - tmp1.txt tmp2.txt tmp3.txt | tar -xvf - -C ./temp
tmp1.txt
tmp2.txt
tmp3.txt
# ls -l temp/
total 12
-rw-r--r-- 1 root root 12 2012-04-09 17:54 tmp1.txt
-rw-r--r-- 1 root root 12 2012-04-09 17:54 tmp2.txt
-rw-r--r-- 1 root root 12 2012-04-09 17:54 tmp3.txt
在上面的命令中,首先创建了 3 个临时文本文件:tmp1.txt, tmp2.txt, tmp3.txt 和一个目录 temp 。在 tar 命令中,管道左边部分意思是将 3 个文件的打包内容送到标准输出,然后这些打包内容通过管道从标准输入中输送给 tar 命令,此时 tar 使用 -x 选项进行还原,被打包内容(还原为对应的文件)被释放到由 -C 选项所指定的 temp 目录里。

7. 使用 -A 选项合并压缩文件
很多时候,我们希望能够将多个包文件合并到一个中去,此时可用 -A 选项:
# tar -cf tmp1.tar tmp1.txt
# tar -cf tmp2.tar tmp2.txt
# ls tmp*.tar
tmp1.tar  tmp2.tar
# tar -Af tmp1.tar tmp2.tar
# tar -tf tmp1.tar
tmp1.txt
tmp2.txt
[/qutoe]

8. 使用 -u 选项根据时间戳更新压缩包里的文件
-u 选项可以根据时间戳来更新包里的文件,也就是说如果外头的文件比包里的文件(两个都是同名文件)的时间戳要来的新,那么就将外头的文件添加到包中,否则不添加:
[quote]# tar -tvf tmp1.tar
-rw-r--r-- root/root     10251 2012-04-09 18:26 tmp1.txt
# tar -uvf tmp1.tar tmp1.txt
# tar -tvf tmp1.tar
-rw-r--r-- root/root     10251 2012-04-09 18:26 tmp1.txt
-rw-r--r-- root/root     10251 2012-04-09 18:26 tmp1.txt
上面,只是使用 -u 再次添加了一次 tmp1.txt 到 tmp1.tar 中,此时压缩包里有两个一样的文件。注意,在压缩包里可以存在两个一样的同名文件,但是要在同一个目录里解压缩时,目录下最终也只会有一个文件,也就是同一个目录下是不允许同时存在两个同名文件的。

下面使用 touch 命令更新一下 tmp1.txt 的时间戳:
# touch tmp1.txt
# ls -l tmp1.txt
-rw-r--r-- 1 root root 10251 2012-04-09 18:35 tmp1.txt
下面用 -u 选项根据时间戳更新包里的文件:
# tar -uvf tmp1.tar tmp1.txt
tmp1.txt
# tar -tvf tmp1.tar
-rw-r--r-- root/root     10251 2012-04-09 18:26 tmp1.txt
-rw-r--r-- root/root     10251 2012-04-09 18:26 tmp1.txt
-rw-r--r-- root/root     10251 2012-04-09 18:35 tmp1.txt
如上,具有更新时间戳的 tmp1.txt 已经被添加进来了。如果尝试再执行一次该命令,那么文件将不会再被添加进来。

9. 使用 --delete 选项从包中删除文件
# tar -cf tmp.tar tmp1.txt tmp2.txt
# tar -tf tmp.tar
tmp1.txt
tmp2.txt
# tar -f tmp.tar --delete tmp1.txt
# tar -tf tmp.tar
tmp2.txt

10. 使用 -d 选项比对文件
-d 选项可以用来比对包内和包外的同名文件,如:
# tar -tf tmp.tar
tmp2.txt
# tar -df tmp.tar tmp2.txt
# echo "are you ok" >> tmp2.txt
# tar -df tmp.tar tmp2.txt
tmp2.txt: Mod time differs
tmp2.txt: Size differs

注意,tar 命令所创建的包(以 tar 结尾)还没有经过压缩,可以通过下面的选项将文件压缩成不同的格式:

-j 选项压缩成 bunzip2 格式,即 file.tar.bz2
-z 选项压缩成 gzip 格式,即 file.tar.gz
--lzma 选项压缩成 lama 格式,即 file.tar.lzma
如:
# tar -cjf tmp.tar.bz2 tmp1.txt

然而,tar 还提供了一个 --auto-compress / -a 选项,该选项可以根据你要生成的压缩文件的后缀名自动生成压缩文件,而不再分别制定 -z, -lzma 之类,这样倒省去了记忆的麻烦,比如:
# tar --auto-compress -cf tmp.tar.gz tmp1.txt

11. 使用 --exclude 选项排除掉不想添加进包中的文件
假设不想将要打包的目录下的 *.txt 文件打包,那么可以:
# ls temp
andy.tar  test2.sh  test.sh  tmp1.txt
# tar -cf temp.tar temp --exclude "*.txt"
# tar -tf temp.tar
temp/
temp/andy.tar
temp/test2.sh
temp/test.sh
我们也可以将不需要打包的文件写到一个文本中,比如 not_include.txt ,然后使用 -X 选项指定该文件,那么在打包时该文件中所列的文件都不会被打包。

12. 使用 --exclude-vcs 打包版本控制系统下的目录
软件开发通常会用到一些版本控制系统软件,比如 Git,cvs,mercurial,svn 等等,这些版本控制系统通常会包含如 .svn ,.git 这些版本管理文件,但这些文件和代码无关,打包时我们并不需要将它们包含进来,因此在打包时使用 --exclude-vcs 可以自动排除这些文件,如:
tar --exclude-vcs -czvf sourcecode.tar my_svn_dir

13. 使用 --totals 打印出总共添加到包中的字节数
--totals 选项可以在打包后打印出总共拷贝了多少字节,如:
# tar -cf temp.tar temp --exclude "*.txt" --totals
Total bytes written: 10240 (10KiB, 3.9MiB/s)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 16:59 , Processed in 0.087864 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表