1

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

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

欢迎任何建议!谢谢!

4

2 回答 2

2

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

例如,假设您要将文件拆分为 4 个部分。如果a, b, c, 和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

给我们四个随机数,总和为S,文件的大小。

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

  1. 计算N随机数(任何随机数)。
  2. 计算X为这些随机数的总和。
  3. 将每个随机数乘以S/X(并确保留下大于 0 且总和为 S 的整数)
  4. 使用您想要的任何工具,使用生成的随机数作为大小将原始文件拆分为多个部分。

这对于 shell 脚本来说有点多,但在 Perl 之类的东西中会非常简单。

于 2013-04-16T17:01:38.500 回答
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 语句,你得到了 final 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

但是您必须自己测试的性能如何……至少这应该满足您的要求。

于 2013-04-16T16:28:10.327 回答