2013-04-16 43 views
0

我知道你可以用split来分割一个文件,但为了测试的目的,我想将一个大文件分割成大小不同的块。这可能吗?有没有办法将大文件拆分为随机大小的块?

另外,如果上述文件是一个zip文件,有没有办法将它分成不等大小的卷?

欢迎任何建议!谢谢!

+1

你想拆分多少个零件?他们应该有多不同? – Kent

+0

让我们说一百个部分,每个部分从几个megs变化到最多约150 mb。 – carlspring

+0

你需要这个想法或者运行代码吗? – Kent

回答

1

因为您只用shell标记了问题。所以我想你只想用shell脚本和那些常用的linux命令/工具来处理它。

据我所知,没有现有的工具/ CMD可以随机分割文件。要拆分文件,我们可以考虑使用split, dd

这两个工具都支持诸如拆分文件的大小(大小)或拆分多少个文件等选项。比方说,我们先使用dd/split将文件分割成500个部分,每个文件具有相同的大小。所以我们有:

foo.zip.001 
foo.zip.002 
foo.zip.003 
... 
foo.zip.500 

然后我们把这个文件列表作为输入,做合并(猫)。这一步可以通过awk或shell脚本完成。

例如,我们可以建立一套cat之类的语句:

cat foo.zip.001, foo.zip.002 > part1 
cat foo.zip.003, foo.zip.004, foo.zip.005 > part2 
cat foo.zip.006, foo.zip.007, foo.zip.008, foo.zip.009 > part3 
.... 

运行生成的报表猫,你有最后part1-n,每个部分都有不同的尺寸。

例如像:

kent$ seq -f'foo.zip.%g' 20|awk 'BEGIN{i=k=2}NR<i{s=s sprintf ("%s,",$0);next}{k++;i=(NR+k);print "cat "s$0" >part"k-2;s="" }'            
cat foo.zip.1,foo.zip.2 >part1 
cat foo.zip.3,foo.zip.4,foo.zip.5 >part2 
cat foo.zip.6,foo.zip.7,foo.zip.8,foo.zip.9 >part3 
cat foo.zip.10,foo.zip.11,foo.zip.12,foo.zip.13,foo.zip.14 >part4 
cat foo.zip.15,foo.zip.16,foo.zip.17,foo.zip.18,foo.zip.19,foo.zip.20 >part5 

但怎么是你要测试你自己的表现......至少这应该适用于您的需求。

+0

+1:整洁的方式,谢谢!我会放弃它。在性能方面:这确实不是问题,因为它将是一代人。我只是想知道如何处理它,如果我想最终还有固定数量的生成文件。 – carlspring

2

所以你问的一般问题是:我怎样才能计算N随机整数总和为S?具体而言,S是文件的大小,而N是您要将其分解成多少个较小的文件。

例如,假设您要将文件分成4个部分。如果abcd有4张随机数,则:

a + b + c + d = X 
a/X + b/X + c/X + d/X = 1 
S*a/X + S*b/X + S*c/X + S*d/X = S 

给予我们4个随机数字,总和S,你的文件的大小。

这意味着你会想编写一个脚本,:

  1. 计算N随机数(任意随机数)。
  2. 计算X作为那些随机数的总和。
  3. 每个相乘的随机数由S/X(并确保你留下了大于0的整数那笔S)
  4. 拆分原始文件到使用所产生的随机数的大小件,使用任何工具,你想。

这对于一个shell脚本来说有点多,但是对于像Perl这样的东西来说,它会非常简单。

+0

感谢所有的数学。相当有帮助。我会接受肯特的解决方案,因为它也是一个实现(尽管不包含大小的部分)。谢谢! – carlspring

相关问题