FileCarve.001
そのため、64MBファイルを512バイトセグメント(各ブロック長は512バイト)に分割しようとしています。小さなファイルに分割するときは、ファイルのデータが同じであることを確認する必要があるため、cat
すべてのファイルをstdoutしてパイプに接続しますsha256sum
(ファイルが多いため、それを使用する必要がありますfind
)xargs
。
コマンドが出力を分割するときにファイルを512バイトのセグメントに分割すると、データが歪むように見えますsplit
。
$ dd if=FileCarve.001 bs=512 | split -b512 - splits/img
131072+0 records in
131072+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 4.10824 s, 16.3 MB/s
$ sha256sum FileCarve.001
3e64100044099b10060f5ca3194d4d60414941c7cb26437330aba532852a60cd FileCarve.001
$ find splits/ -type f -print0 | xargs -0 cat | sha256sum
25b37f28204895e5d0b1cb160c5fa599d15188baf7e529ccc92a10fdb3f0515a -
しかし、ファイルを1KBセグメント(1000バイト)に分割するとうまくいくようです。
$ dd if=FileCarve.001 bs=512 | split -b1k - splits/img
131072+0 records in
131072+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 2.06029 s, 32.6 MB/s
$ sha256sum FileCarve.001
3e64100044099b10060f5ca3194d4d60414941c7cb26437330aba532852a60cd FileCarve.001
$ find splits/ -type f -print0 | xargs -0 cat | sha256sum
3e64100044099b10060f5ca3194d4d60414941c7cb26437330aba532852a60cd -
なぜ違うの?ストレージデバイスでブロックがどのように機能するかについて私が理解していない部分はありますか?
コメントへの応答:私はsplit/
実行するたびにディレクトリを消去します。
ベストアンサー1
find
ファイルが処理される順序は定義されていません。これは、基本的なシステムコールによって提供されたものと同じ順序であってもよく、基本的なファイルシステム構造に依存し、本質的にランダムであってもよい。一部の実装では、どのような方法でもリストを処理できますが、並べ替えることは期待していません。
小さなファイルを試してみましょう。cat frag*
Shell globはファイル名をソートするので、正しいファイルを再現します。
$ split -b512 orig.bin frag
$ cat frag* > new.bin
$ sha256sum orig.bin new.bin
8d12b42623eeefee872f123bd0dc85d535b00df4d42e865f993c40f7bfc92b1e orig.bin
8d12b42623eeefee872f123bd0dc85d535b00df4d42e865f993c40f7bfc92b1e new.bin
しかし、find
そうではないので、別のファイルを取得します。
$ find . -name 'frag*' -exec cat {} + > second.bin
$ sha256sum second.bin
821325739ca65d1cb568ecf3a16bd2e01ac4eef1419b4d714834fab07d2f135c second.bin
find
印刷名を実行すると、次のことがよくわかります。
$ find . -name 'frag*' |head -5
./fragzbgv
./fragzbmg
./fragvt
./fragyd
./fragzayc
Linuxとext4にあります。私の考えでは、ファイル名を保存するために一種のハッシュとツリーを使用しているので、一見ランダムな順序が発生しているようです。 tmpfsからリストを取得します。キャンセルランダムではありませんが、まだ状況を台無しにする生成順序。
ファイル名のリストを明示的に並べ替えると便利です。
$ find . -name 'frag*' -print0 | sort -z | xargs -0 cat > third.bin
$ sha256sum third.bin
8d12b42623eeefee872f123bd0dc85d535b00df4d42e865f993c40f7bfc92b1e third.bin
1,000ブロックで動作するという事実は偶然かもしれません。
しかし、なぜファイル名を直接指定するのではなく、dd bs=512
入力を使用しているのかわかりません。それが行うことは、特定のブロックサイズを使用して読み書きすることですが、その間のパイプはブロックサイズを維持せずにバイトストリームにすぎません。cat
split
dd
dd
sort
してはいけないファイルを読み取るために使用するブロックサイズ(512(2 ^ 8)バイトまたは521(プライム)バイト)に興味があります。