web-dev-qa-db-ja.com

バイナリデータで標準の入出力を使用しても安全ですか?

バイナリファイルを2つに分割する必要があります。私は頭や尾を使用できるかどうか疑問に思っていましたが、その後疑問に思いました...バイナリデータでリダイレクト、パイピングなどを使用しても安全ですか?新しい行が台無しになったり、nullが無視されたり、バックスペースや削除が何か特別なことをしますか? (bash、kubuntu 18.04 LTS)

14
B.Tanner

はい、別のプロセスにパイプするか、ファイルに保存しても安全です。バイナリstdoutをターミナルに出力させると、ターミナルディスプレイを一時的に混乱させる可能性のあるエスケープシーケンス(ランダム)を含めることができるため、潜在的な「奇妙さ」があります。

19
Eric Mintz

headtailなどのコマンドを使用する場合の主な問題は、それらが行指向であり、バイナリファイルがそうではないことです。改行が含まれている場合、行の終わりを表すために使用されていないことが多く、含まれている場合は、プログラムメッセージやデータフィールドなどの文字列の一部である可能性があります。

データが何らかの方法で構造化されている場合は、分割点を選択する際にその点を考慮して、途中で構造を壊さないようにする必要があります。

ファイルの構造がわかっている場合は、次のようなコマンドを使用できます

dd -if input-file -of output-file ...

特定の(増分された)オフセットから始まる特定サイズの非常に多くのデータブロックのみをファイルにコピーするオプションがあります。

@egmontが言及したsplitコマンドはこのプロセスを自動化するように見えますが、デフォルトでは行指向のように見えるため、--bytes countなどの追加オプションを指定する必要があります。ファイルの各部分の大きさを教えてください。


補足として、ファイルの内容がわからないが、少なくとも意味のあるテキストデータが含まれていると思われる場合は、stringsコマンドを使用して、最初に見て、何を扱っているかを確認してください。と。

strings -n 6 file | less

少なくとも6文字の長さの印刷可能な文字のすべての実行を検索し、それらがページャーで表示されるので、端末上を飛び回ることはありません。デフォルトの4文字よりも少し大きい数字を使用すると、たまたま印刷可能になったがファイルではそのように使用されていないデータの小さな断片を排除できます。

後でhexeditなどのバイナリエディターでファイルをさらに詳しく調べる必要がある場合は、興味深いものが見つかる場所を示すいくつかのランドマークがあります。

stringsにはオプション-t xがあり、これは各印刷文字列の前にファイルへのオフセットを16進数(8進数の場合はo、10進数の場合はd)で示します。非常に短いファイルであっても、文字ごとに見なければならない場合には対処する必要があります。

1
Joe