次のコマンドで生成されたファイルを想像してみてください。
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ファイルを解析する必要があります。