2013-04-16 80 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

相關問題