スパースファイルの非スパース部分を表示するには?

スパースファイルの非スパース部分を表示するには?

次のコマンドで生成されたファイルを想像してみてください。

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

"test\n"現在、途中で書き込みを含む2テビバイトファイル(ディスクで4kiBを占める)があります。

"test"ファイル全体を読み取らずに効率的に復元するにはどうすればよいですか?

tr -d '\0' < file

結果をお知らせしますが、数時間かかります。

私が望むのは、ファイルのまれな部分だけを出力することです(したがって、上記は、その"test\n"データが格納されているディスクに割り当てられた4kiBチャンクである可能性が高いです)。

ファイルのどの部分を調べるAPIがあります割り当てられた(FIBMAP、FIEMAP、SEEK_HOLE、SEEK_DATA ...)が、どのツールがそれを公開していますか?

(少なくともこれらのAPIをサポートするオペレーティングシステムの場合)移植可能なソリューションがある場合は感謝します。

答え1

これまで私が考えることができる最も良いのは(ksh93、1.42.9filefragで使用されていましたe2fsprogs(一部の古いバージョンには他の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、作成されたがまだ作成されていないファイル(まれではありませんが、興味のないゼロでいっぱいのファイル)について説明します。

bsdtarあるいは、最新バージョンでは、これらのAPIのいくつかを使用して、希薄な部分を識別するファイルを生成することもstarできます。tarこれはもっと作ります持ち運べるただし、まれな部分を取得するには、結果のtarファイルを解析する必要があります。

関連情報