有没有办法将大文件拆分成随机大小的块?

时间:2013-04-16 14:33:09

标签: bash shell

我知道您可以使用split拆分文件,但出于测试目的,我想将大文件拆分为大小不同的块。这可能吗?

或者,如果上述文件是zip,是否有办法将其拆分为不等大小的卷?

欢迎任何建议!谢谢!

2 个答案:

答案 0 :(得分:2)

因此,您要问的一般问题是:如何计算总计为N的{​​{1}}个随机整数?具体来说,S是文件的大小,S是要将其分成多少个较小的文件。

例如,假设您要将文件拆分为4个部分。如果Nabc是四个随机数,则:

d

给我们四个随机数,总和为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 ,即文件的大小。

这意味着您要编写一个脚本:

  1. 计算S个随机数(任意随机数)。
  2. N计算为这些随机数的总和。
  3. 将每个随机数乘以X(并确保剩下的整数大于0的总和为S)
  4. 使用生成的随机数作为大小,使用您想要的任何工具将原始文件拆分成碎片。
  5. 这对于一个shell脚本来说有点多,但在像Perl这样的东西中会很简单。

答案 1 :(得分:1)

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

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

这两个工具都支持以下选项:分割文件的大小(大小)或者要分割的文件数量。比方说,我们使用dd / split首先将文件分成500个部分,每个文件都有相同的大小。所以我们有:

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

然后我们将此文件列表作为输入,进行合并(cat)。这一步可以通过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
....

运行生成的cat语句,你得到最终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

但是你必须自己测试的性能如何......至少这应该适合你的要求。