Chinaunix首页 | 论坛 | 博客
  • 博客访问: 684084
  • 博文数量: 207
  • 博客积分: 1743
  • 博客等级: 上尉
  • 技术积分: 2044
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-20 14:36
文章分类

全部博文(207)

文章存档

2016年(24)

2015年(10)

2014年(50)

2013年(45)

2012年(78)

分类: LINUX

2015-05-20 16:10:06

目标-(标准)


如何将文件打包、压缩并分割成制定大小?
日期: August 28 日, Saturday@ 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



实现-怎么做(细节)

为了让广大菜鸟了解上面的命令,现解释如下:
压缩命令"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 命令" 来查阅他们的手册。


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

这篇文章的URL是:
modules.php?op=modload&name=News&file=article&sid=47

实践




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

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

xiongmc@xiongmc:~/project/pad$ tar -jcf - Pad/ | split -b 500000 - pad.tar.bz2.
split: 已排除输出文件后缀
xiongmc@xiongmc:~/project/pad$ tar -jcf - Pad/ | split -m 500 - pad.tar.bz2.
split:无效选项 -- m
请尝试执行"split --help"来获取更多信息。
xiongmc@xiongmc:~/project/pad$ tar -jcf - Pad/ | split -M 500 - pad.tar.bz2.
split:无效选项 -- M

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

结论-继续学习:

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

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


请尝试执行"split --help"来获取更多信息。
xiongmc@xiongmc:~/project/pad$ tar -jcf - Pad/ | split -m 500m - pad.tar.bz2.
split:无效选项 -- m
请尝试执行"split --help"来获取更多信息。
xiongmc@xiongmc:~/project/pad$ tar -jcf - Pad/ | split -b 500m - pad.tar.bz2.


xiongmc@xiongmc:~/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

解压

xiongmc@xiongmc:~/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
阅读(5685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~