如何显示稀疏文件的非稀疏部分?


8

想象一下使用以下命令创建的文件:

truncate -s1T file
echo test >> file
truncate -s2T file

我现在有一个2 tebibyte文件(在磁盘上占用4kiB),"test\n"中间写着。

我将如何"test"有效地恢复它,而不必读取整个文件。

tr -d '\0' < file

将给我结果,但这将需要几个小时。

我想要的是仅输出文件的非稀疏部分的东西(仅在"test\n"或更可能的情况下,分配在存储该数据的磁盘上分配的4kiB块)。

有API可以找出分配文件的哪一部分(FIBMAP,FIEMAP,SEEK_HOLE,SEEK_DATA ...),但是哪些工具可以公开这些内容?

便携式解决方案(至少支持这些API的OS)将受到赞赏。


有效率strings吗?
glenn jackman 2014年

@glennjackman,tr它比起仍然读取整个文件并执行更多的操作要多,而不仅仅是删除NUL字节。
斯特凡Chazelas

Answers:


6

我能想出迄今最好的是(ksh93的,使用filefrage2fsprogs1.42.9(一些旧版本有不同的API),在Linux上基于盘的文件系统):

#! /bin/ksh93
export LC_ALL=C
for file do
filefrag -vb1 -- "$file" |
  while IFS=": ." read -A a; do
    [[ $a = +([0-9]) ]] && [[ ${a[@]} != *unwritten* ]] &&
      command /opt/ast/bin/head -s "${a[1]}" -c "${a[7]}" -- "$file"
  done
done

filefrag 使用FIEMAP ioctl报告支持文件系统的文件范围。

*unwritten*部分介绍了已fallocated写入但尚未写入的文件(非稀疏但仍然充满零,我不感兴趣)。

bsdtarstar可以使用其中一些API的最新版本来生成一个tar文件,该文件可以这样标识稀疏部分。这将提供一种更可移植的解决方案,但是随后将不得不解析生成的tar文件以获取非稀疏部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.