Gunzip / Extractファイル「部分ごと」
-
03-10-2019 - |
質問
私は制限されたディスクスペースを備えた共有サーバーを使用しており、私が持っているものよりも多くの巨大なファイルにスーパー拡張するGZファイルを持っています。 「部分」で「部分」を抽出するには(一度に10 MBとしましょう)、各部分を一時的に抽出せずに処理するにはどうすればよいですか?
いいえ、これは1つの非常に巨大な圧縮ファイルであり、ファイルのセットではありません...
こんにちはデビッド、あなたのソリューションは非常にエレガントに見えますが、私がそれを正しく読んでいるなら、ファイルの先頭からgunzipが抽出するたびに(そしてその出力が捨てられているようです)。それは私が乗っている共有サーバーに大きな負担をかけると確信しています(私はそれが「先を読む」とはまったく思いません) - あなたは私が必要な番号を「スキップ」する方法についての洞察を持っていますか?ブロックの?
解決
(unix/linux)シェルツールでこれを行っている場合、使用できます gunzip -c
stdoutに非圧縮するには、使用します dd
とともに skip
と count
1つのチャンクのみをコピーするオプション。
例えば:
gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output
次に、スキップ= 1、スキップ= 2など。
他のヒント
残念ながら、必要なことを正確に実行する既存のUNIXコマンドを知りません。あらゆる言語の小さなプログラム、たとえばPythonで簡単にそれを行うことができます。 cutter.py
(もちろん、どんな言語も同様に行います):
import sys
try:
size = int(sys.argv[1])
N = int(sys.argv[2])
except (IndexError, ValueError):
print>>sys.stderr, "Use: %s size N" % sys.argv[0]
sys.exit(2)
sys.stdin.seek((N-1) * size)
sys.stdout.write(sys.stdin.read(size))
今 gunzip <huge.gz | python cutter.py 1000000 5 > fifthone
ファイルに入れます fifthone
ちょうど100万バイトで、非圧縮ストリームの最初の400万バイトをスキップします。