我知道您可以使用 拆分文件split
,但出于测试目的,我想将一个大文件拆分为大小不同的块。这可能吗?
或者,如果上述文件是 zip,有没有办法将其拆分为大小不等的卷?
欢迎任何建议!谢谢!
因此,您要问的一般问题是:如何计算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
,文件的大小。
这意味着您要编写一个脚本:
N
随机数(任何随机数)。X
为这些随机数的总和。S/X
(并确保留下大于 0 且总和为 S 的整数)这对于 shell 脚本来说有点多,但在 Perl 之类的东西中会非常简单。
因为你只用 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
但是您必须自己测试的性能如何……至少这应该满足您的要求。