unix中的文件切割
前几日,为了将一台安装sco unix 5.0.5主机上的tar打包文件备份, 需要将其通过网络传送到另外一台配有磁带机的unix主机上。两台主机通过tx530网卡相连,用ftp传送的时候,前几个文件分别在10m、20m字节大小,都能够顺利传送。但其中有一个文件压缩后体积已达98m之巨,传送了几次,要么只能传40m, 要么只能传20m左右就导致网络崩溃,换画面ping对方主机,本应为零的速率延迟降为2400多毫秒,而且误码率极高,只有重新启动两台主机才能恢复网络通讯。
unix的shell功能强大,非windows可比,从上面使用的tar、ftp已可管窥。同样,unix已经提供了文件切割功能,不需要费力气去寻找第三方的文件切割程序。能完成这个功能的unix命令就是dd。
要切割的大文件为dgjd,共98336321字节,则:
dd if=dgjd of=zz1 bs=1 count=20000000
dd if=dgjd of=zz2 bs=1 count=20000000 skip=20000000
dd if=dgjd of=zz3 bs=1 count=20000000 skip=40000000
dd if=dgjd of=zz4 bs=1 count=20000000 skip=60000000
dd if=dgjd of=zz5 bs=1 count=18336321 skip=80000000
其中if(input filename)是要切割的大文件名,of(output filename)是切割后的子文件名,bs是指明以多少字节作为一个切割记录单位,count是要切割的单位记录数,skip是说明切割时的起点,单位同样以bs设定值为准。通过上述五条指令就将dgjd大文件切割成为4个2千万字节、1个18336321字节的子文件。要注意的是skip的值不能错。 由此也不难看出,dd切割是“非损耗”式的切割,并且支持从任意位置开始的任意大小的切割。
要将生成的zz1、zz2、zz3、zz4四个子文件组装为xdgjd,则:
dd if=zz1 of=xdgjd bs=1 count=20000000
dd if=zz2 of=xdgjd bs=1 count=20000000 seek=20000000
dd if=zz3 of=xdgjd bs=1 count=20000000 seek=40000000
dd if=zz4 of=xdgjd bs=1 count=20000000 seek=60000000
dd if=zz5 of=xdgjd bs=1 count=18336321 seek=80000000
其中skip参数改为seek参数,指明组装的新大文件xdgjd每次的开始位置是从文件头开始多少字节。如果缺省,则组装从文件头开始,显然这不是我们每次都希望的, 所以需用seek参数明确指出开始位置。通过以上5个指令,即可将5个子文件重新组装为一个大文件。
将切割后生成的子文件重新用ftp传送,结果有的能够顺利传送, 有的仍然导致网络瘫痪,不怕,继续切割,切成每个一千万字节,再传,ok!成功传送!
测试表明,每次传送的文件最好小于12m字节,否则可能导致网络故障。另外,dd这个命令最初是为了进行编码转换而设计的,用于在大型机中将ebcdic字符代码转换为ascii代码,但此功能已不常用,现在dd成了文件系统备份的工具,以及做一些类似文件切割的“另类业务”,正所谓“有心栽花花不开,无心插柳柳成荫”,不过对于用户来说,重要的是软件能否完成自己需要的功能,它的“本职工作”是什么并不重要,“不管白猫黑猫,捉住老鼠就是好猫”!实用为本,软件的生命力就在于实用。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器