次のように作成されたファイルを想像してください。
truncate -s1T file
echo test >> file
truncate -s2T file
現在、2テビバイトのファイル(ディスク上で4kiBを占めています)"test\n"
があり、中央に書き込まれています。
それを"test"
効率的に回復するにはどうすればよいでしょうか。つまり、ファイル全体を読み取る必要がありません。
tr -d '\0' < file
結果は出ますが、それは数時間かかります。
私"test\n"
が欲しいのは、ファイルの非スパース部分のみを出力するものです(そのため、そのデータを格納するディスクに割り当てられた4kiBブロックのみまたはそれ以上の可能性があります)。
ファイルのどの部分が割り当てられているかを確認するAPI (FIBMAP、FIEMAP、SEEK_HOLE、SEEK_DATA ...)がありますが、それらを公開しているツールは何ですか?
ポータブルソリューション(少なくともこれらのAPIをサポートするOSにとって)が評価されます。
tr
それでもファイル全体を読み取り、NULバイトを削除する以上のことを行うので、より少ないです。
strings
か?