我有大約60MB的8000 gz文件。我想將它們合併成幾個較大的文件。那麼如何在bash腳本中做到這一點而不解壓縮?Shell腳本:將小gzip文件加入大文件而不解壓縮
Shell腳本可能會將輸入視爲新文件大小或要組合的文件數。
例如說我有1.gz,2.gz,3.gz ... 10.gz 現在我需要一個文件每個說3個文件,所以現在1.gz,2.gz和3.gz將結合成1_new.gz等。
我有大約60MB的8000 gz文件。我想將它們合併成幾個較大的文件。那麼如何在bash腳本中做到這一點而不解壓縮?Shell腳本:將小gzip文件加入大文件而不解壓縮
Shell腳本可能會將輸入視爲新文件大小或要組合的文件數。
例如說我有1.gz,2.gz,3.gz ... 10.gz 現在我需要一個文件每個說3個文件,所以現在1.gz,2.gz和3.gz將結合成1_new.gz等。
有可能concatinate gzip
版文件放在一起,但是當你gunzip
生成的文件,你會得到一個單一的流,請參閱gzip manual以供參考。
腳本將類似於安斯加爾Wiechers的一個tar
:
#!/bin/bash
maxnum=$1
i=1
j=0
for f in *.gz; do
cat $f >> archive_$j.gz
i=$((i+1))
if [ $i -eq $maxnum ]; then
i=1
j=$((j+1))
fi
done
注意,上面的代碼是未經測試。
如果要存檔的東西正確tar
是一個更好的解決方案,但如果你想要做的是concatinate一些已gzip
ED那麼這樣的concatination,因爲這是好文件。
謝謝你,這足夠:) – Amar
gzip
只能壓縮單個文件。您需要tar
將多個文件合併到一個歸檔中,然後可以(可選)使用gzip
進行壓縮。如果你只是要合併的壓縮文件,可以使用這樣的事情:
maxnum=$1
i=1
j=0
for f in *.gz; do
tar rf archive_$j.tar $f
if [ $i -eq $maxnum ]; then
i=1
j=$((j+1))
fi
done
這將產生含有的壓縮源文件未壓縮tar文件。
如果要生成包含未壓縮源文件的壓縮tar文件,上述操作將不起作用,因爲您無法更新壓縮tar文件。你需要先解壓縮源文件,然後創建它們壓縮tar文件:
maxnum=$1
i=1
j=0
flist=
for f in *.gz; do
gunzip $f
flist="$flist $(basename $f .gz)"
if [ $i -eq $maxnum ]; then
tar czf archive_$j.tar.gz --remove-files $flist
i=1
j=$((j+1))
flist=
fi
done
嗨安斯加,感謝您的詳細回覆:)但我只需要結合大量的gzip文件,而不需要將它們解壓縮到少數幾個文件,這就是它的要求。如果我不清楚,我會編輯這個問題。 – Amar
請編輯你的問題,包括你已經嘗試過。祝你好運。 – shellter
將原始大文件拆分爲小文件的一種方法:http://en.wikipedia.org/wiki/Split_(Unix) – Bernhard
@shellter和Brian:對不起,我不熟悉shell腳本。 – Amar