天天看点

tar分包压缩与合并



转自:http://blog.csdn.net/xiongmc/article/details/17721533

目标-(标准)

如何将文件打包、压缩并分割成制定大小?

日期: August 28 日, [email protected] 01:37:03

主题 Shell 编程和工具

(如何在Linux下实现Windows中winrar和winzip等压缩软件所提供的打包压缩分割功能)

将大文件或目录打包、压缩并分割成制定大小的文件,这在将数据备份到容量有限的移动储存设备时是必须的,在linux下可以通过组合使用 tar,bzip2(或者gzip),split命令来实现。

案例-(故事)

假设要将下面这个文件压缩并分割成多个1.4M的文件

-r-xr-xr-x 1 root root 4.4M 2004-08-27 01:50 a.chm

可以用下面的命令:

tar -jcf - a.chm | split -b 1400k - a.chm.tar.bz2.

完成后会生产下面的文件:

-rw-r--r-- 1 root root 1433600 2004-08-27 01:55 a.chm.tar.bz2.aa

-rw-r--r-- 1 root root 1433600 2004-08-27 01:56 a.chm.tar.bz2.ab

-rw-r--r-- 1 root root 1433600 2004-08-27 01:56 a.chm.tar.bz2.ac

-rw-r--r-- 1 root root 225280 2004-08-27 01:56 a.chm.tar.bz2.ad

还原文件用下面的命令:

cat a.chm.tar.bz2.a* | tar -jx, 注意,这里如果是gzip格式的,则是tar -zx

实现-怎么做(细节)

为了让广大菜鸟了解上面的命令,现解释如下:

压缩命令"tar -jcf -" 中的 “-jcf" 参数是创建(c)文件(f)并调用bzip2进行压缩(j),跟在f后面的" -"是将所创建的文件输出到标准输出上,在这里就是通过"|"管道输出给 split 命令进行文件分割;分割命令"split -b 1400k - a.chm.tar.bz2." 中的 "-b 1400k" 是用来设置每个文件大小的,除了"k",还可以用"m"来作为单位,接着的" - "就是将"tar"命令通过管道传入的数据作为需要分割的数据来源,后面跟着的" a.chm.tar.bz2."就是文件名了。

这两个命令如果独立使用,可以将参数中独立的" - "换为具体的文件名,这样"tar"命令就可以将文件打包压缩成指定的文件,而"split"命令就可以分割指定的文件。

在"tar"命令中,大家也可以用"z"代替"j"参,这样tar就会调用gzip进行压缩,而不是bzip2,当然,如果你用了"z"参数,记得将输出的文件名中的"bz2"改为"gz",这样在解压的时候就可以分辨出需要用那个参数进行解压。

用split命令生产的文件序列除了字母还可以使用" -d "参数指定为数字的形式,同时还可以通过" -a x"来设定序列的长度(默认值是2),例如命令:

split -b 1400k -d -a 1 - a.chm.tar.bz2.

就可以产生如下命名规则的文件:

-rw-r--r-- 1 root root 1.4M 2004-08-28 01:01 a.chm.tar.bz2.0

-rw-r--r-- 1 root root 1.4M 2004-08-28 01:02 a.chm.tar.bz2.1

-rw-r--r-- 1 root root 1.4M 2004-08-28 01:02 a.chm.tar.bz2.2

-rw-r--r-- 1 root root 220K 2004-08-28 01:02 a.chm.tar.bz2.3

如果大家想更全面地了解这些命令,可以通过 "man 命令" 来查阅他们的手册。

这篇文章来自于 菜鸟翱翔站

http://clfaq.3322.org/

这篇文章的URL是:

http://clfaq.3322.org/modules.PHP?op=modload&name=News&file=article&sid=47

实践

自我反省-(反馈分析)-差距

================================

[email protected]:~/project/pad$ tar -jcf - Pad/ | split -b 500000 - pad.tar.bz2.

split: 已排除输出文件后缀

[email protected]:~/project/pad$ tar -jcf - Pad/ | split -m 500 - pad.tar.bz2.

split:无效选项 -- m

请尝试执行"split --help"来获取更多信息。

[email protected]:~/project/pad$ tar -jcf - Pad/ | split -M 500 - pad.tar.bz2.

split:无效选项 -- M

++只是认准 第一个参数的问题,没考虑 500的问题。所以要搞清楚问题是什么?再找专业人士去解决。

结论-继续学习:

自己没有问,为什么是这个问题。一直就认为是这个的问题。尝试了多次后,发现还是无法解决,这个时候情绪就来了,相反我们应该像《穷爸爸,富爸爸》说的:“停下你手头的活儿,也就是说,先停下来,评估一下你正在做的事情中什么是有效的,什么是无效的。神志不清就是指做同一件事情却希望有不同的结果----结果或许是由于多个方面的原因导致的。不要做哪些无效的事情,找一些有效的事情去做。”

具体就是不是“-b” 的问题, 自己臆想的认为是。但是没有考虑是 500 的问题,因为尝试修改“-b” 改为 “-m” 未成功。然而你没有去怀疑 500,因为你固执,偏见,缺乏变通的思维。所以我们在动手前先问题是什么问题,然后找

专业人士去解决。

请尝试执行"split --help"来获取更多信息。

[email protected]:~/project/pad$ tar -jcf - Pad/ | split -m 500m - pad.tar.bz2.

split:无效选项 -- m

请尝试执行"split --help"来获取更多信息。

[email protected]:~/project/pad$ tar -jcf - Pad/ | split -b 500m - pad.tar.bz2.

[email protected]iongmc:~/project/pad/test$ ll

总用量 4870924

drwxrwxr-x 2 xiongmc xiongmc      4096  4月 12 19:05 ./

drwxrwxr-x 4 xiongmc xiongmc     32768  4月 12 19:05 ../

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:47 pad.tar.bz2.aa

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:51 pad.tar.bz2.ab

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:52 pad.tar.bz2.ac

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:54 pad.tar.bz2.ad

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:55 pad.tar.bz2.ae

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:56 pad.tar.bz2.af

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 18:58 pad.tar.bz2.ag

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 19:00 pad.tar.bz2.ah

-rw-rw-r-- 1 xiongmc xiongmc 524288000  4月 12 19:03 pad.tar.bz2.ai

-rw-rw-r-- 1 xiongmc xiongmc 269156352  4月 12 19:05 pad.tar.bz2.aj

解压

[email protected]:~/project/pad/test$ cat pad.tar.bz2.a* | tar -jx

================================

2》

要将目录logs打包压缩并分割成多个1M的文件,可以用下面的命令:

 tar cjf - logs/ |split -b 1m - logs.tar.bz2.

完成后会产生下列文件:

 logs.tar.bz2.aa, logs.tar.bz2.ab, logs.tar.bz2.ac

要解压的时候只要执行下面的命令就可以了:

cat logs.tar.bz2.a* | tar xj

再举例:

要将文件test.pdf分包压缩成500 bytes的文件:

tar czf - test.pdf | split -b 500 - test.tar.gz

最后要提醒但是那两个"-"不要漏了,那是tar的ouput和split的input的参数。

gzcat sxrt5.0.dvd1.tar.gza[a-c]|tar xvf -

1、合并使用spilt分割的文件

   # cat sxrt5.0.dvd1.tar.gzaa  sxrt5.0.dvd1.tar.gzab  sxrt5.0.dvd1.tar.gzac >>sxrt5.0.dvd1.tar.gz

2、解压gz文件

   # gunzip sxrt5.0.dvd1.tar.gz

3、解tar包

   # tar xvf sxrt5.0.dvd1.tar