今日、私は新しいリポジトリのためにハックしているフィルタリングされたサブバージョンダンプである800MBの混合テキスト/バイナリファイルから最初の1131バイトを削除する必要がありました。最良のアプローチは何ですか?
まず試しました
dd bs=1 skip=1131 if=filtered.dump of=trimmed.dump
ただし、スキップすると、ファイルの残りの部分は一度に1バイトずつコピーされます。つまり、非常に遅いです。最後に、それを3つの512チャンクに丸めるには405バイトが必要であることを知り、スキップできました。
dd if=/dev/zero of=405zeros bs=1 count=405
cat 405zeros filtered.dump | dd bs=512 skip=3 of=trimmed.dump
かなり早く完了しましたが、より簡単でより良い方法がありますか?私が忘れた他のツールはありますか?
ベストアンサー1
bsを切り替えてオプションをスキップできます。
dd bs=1131 skip=1 if=filtered.dump of=trimmed.dump
これにより、タスクがより大きなチャンクで利点を得ることができます。
それ以外の場合は、tailを試すことができます(バイナリと一緒に使用するのは安全ではありませんが)。
tail -c +1132 filtered.dump >trimmed.dump
最後に、3つのddインスタンスを使用して次のように作成できます。
dd if=filtered.dump bs=512k | { dd bs=1131 count=1 of=/dev/null; dd bs=512k of=trimmed.dump; }
これらのddの1つ目はfilter.dumpを標準出力として印刷し、2つ目は1131バイトのみを読み取り、それを破棄します。最後のddは標準入力からfiltered.dumpの残りのバイトを読み取り、それをクリーンアップされた.dumpに書き込みます。