非常に大きなファイルを扱う

非常に大きなファイルを扱う

故障したハード ドライブ上のコマンドの出力である、非常に大きなファイルが 2 つ (27G と 40G) ありますdd。最初のバイトを比較して、27G バイトが 40G の先頭/部分文字列であるかどうかを確認したいと考えました。

コマンドを使いたかったのですheadが、これらのファイルはバイナリなので、-c引数を使用しました。

# ls -ahl *.dd
-rw-r--r-- 1 root root 40G May 17 20:16 mac.dd
-rw-r--r-- 1 root root 27G May 18 09:47 mac2.dd

1K の生データを取得しようとしています:

# head -c1K mac.dd
(returns nothing)

16進ダンプで1Kを取得しようとしています:

# head -c1K mac.dd | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400
(end)

16進ダンプで10Kを取得しようとしています:

# head -c10K mac.dd | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0002800
(end)

それでも:

/bin/ls で 100 バイトの生データを取得しようとしています:

# head -c100 /bin/ls 
ELF>�H@@p�@8    @@@@@@�

/bin/ls で 100 バイトの 16 進データを取得しようとしています:

# head -c100 /bin/ls | hexdump
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0002 003e 0001 0000 4880 0040 0000 0000
0000020 0040 0000 0000 0000 b670 0001 0000 0000
0000030 0000 0000 0040 0038 0009 0040 001c 001b
0000040 0006 0000 0005 0000 0040 0000 0000 0000
0000050 0040 0040 0000 0000 0040 0040 0000 0000
0000060 01f8 0000                              
0000064

mac2.dd の結果はまったく同じですが、出力は実際には期待したものとは異なるようです。したがって、ファイルが同じデータで始まることを意味しているとは思いません。バイナリの先頭が/bin/ls期待どおりです。

このファイルの出力が理解できませんdd。どなたか説明していただけますか?

ありがとう。

答え1

自分自身に答えています。

私はから知りましたこの郵便受け、hexdump の " " は*"前の行と同じ" を意味します。つまり、ddファイル全体が文字で埋め尽くされているということです\0

次のように明示的に表現できます:

head -c1000 mac.dd | hexdump -v
0000000 0000 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
[...]

あるいはもっと短く言うと:

# hexdump -v -n1000 mac.dd
0000000 0000 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
[...]

ddだから今、ゴミ捨て場には何も入っていないことが分かりました。

私の問題をここまで読んでくださった皆様に感謝します。

関連情報