小さなファイルを512バイトのセグメントに分割すると変更されますが、1kセグメントに分割すると変更されません。

小さなファイルを512バイトのセグメントに分割すると変更されますが、1kセグメントに分割すると変更されません。

FileCarve.001そのため、64MBファイルを512バイトセグメント(各ブロック長は512バイト)に分割しようとしています。小さなファイルに分割するときは、ファイルのデータが同じであることを確認する必要があるため、catすべてのファイルをstdoutしてパイプに接続しますsha256sum(ファイルが多いため、それを使用する必要がありますfindxargs

コマンドが出力を分割するときにファイルを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入力を使用しているのかわかりません。それが行うことは、特定のブロックサイズを使用して読み書きすることですが、その間のパイプはブロックサイズを維持せずにバイトストリームにすぎません。catsplitddddsortしてはいけないファイルを読み取るために使用するブロックサイズ(512(2 ^ 8)バイトまたは521(プライム)バイト)に興味があります。

おすすめ記事