Представьте себе файл, созданный с помощью:
truncate -s1T file
echo test >> file
truncate -s2T file
Теперь у меня есть файл 2 тэбибайт (который занимает 4киБ на диске), с записью "test\n"
в середине.
Как бы я восстановил это "test"
эффективно, то есть без необходимости читать весь файл.
tr -d '\0' < file
Даст мне результат, но это займет несколько часов.
То, что я хотел бы, это то, что выводит только не разреженные части файла (так что выше "test\n"
или более вероятно, блок 4kiB, выделенный на диске, который хранит эти данные).
Существуют API-интерфейсы для определения того, какая часть файла выделена (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), но какие инструменты предоставляют их?
Переносимое решение (по крайней мере, для операционных систем, поддерживающих эти API) приветствуется.
tr
поскольку он все еще читает весь файл и делает больше, чем просто удаляет байты NUL.
strings
?