Wie werden die nicht spärlichen Teile einer spärlichen Datei angezeigt?

8

Stellen Sie sich eine Datei vor, die erstellt wurde mit:

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

Ich habe jetzt eine 2-Tebibyte-Datei (die 4 KB auf der Festplatte belegt), "test\n"die in der Mitte geschrieben ist.

Wie würde ich das "test"effizient wiederherstellen, ohne die gesamte Datei lesen zu müssen?

tr -d '\0' < file

Würde mir das Ergebnis geben, aber das würde Stunden dauern.

Was ich möchte, ist etwas, das nur die nicht spärlichen Teile der Datei ausgibt (also nur oben "test\n"oder wahrscheinlicher den 4kiB-Block, der auf der Festplatte zugewiesen ist, auf der diese Daten gespeichert sind).

Es gibt APIs, um herauszufinden, welcher Teil der Datei zugeordnet ist (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), aber welche Tools machen diese verfügbar?

Eine tragbare Lösung (zumindest für die Betriebssysteme, die diese APIs unterstützen) wäre wünschenswert.

Stéphane Chazelas
quelle
Wie effizient ist strings?
Glenn Jackman
@glennjackman, weniger als trda es immer noch die gesamte Datei liest und mehr als nur die NUL-Bytes entfernt.
Stéphane Chazelas

Antworten:

6

Das Beste , was ich mit so weit kommen könnte , ist (ksh93, mit filefragvon e2fsprogs1.42.9 (einige älteren Versionen eine andere API), auf Umfang basierten Dateisysteme unter 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 meldet den Umfang der Datei mithilfe von FIEMAP ioctl für die Dateisysteme, die sie unterstützen.

Der *unwritten*Teil behandelt die (nicht spärlichen, aber immer noch voller Nullen, an denen ich nicht interessiert bin) Dateien, die fallocatedgeschrieben, aber nicht geschrieben wurden.

Neuere Versionen von bsdtaroder starkönnen einige dieser APIs verwenden, um eine tarDatei zu generieren , die die spärlichen Abschnitte als solche identifiziert. Das würde zu einer portableren Lösung führen, aber dann müsste man die generierte TAR-Datei analysieren, um die nicht spärlichen Abschnitte zu erhalten.

Stéphane Chazelas
quelle