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.
quelle
strings
?tr
da es immer noch die gesamte Datei liest und mehr als nur die NUL-Bytes entfernt.Antworten:
Das Beste , was ich mit so weit kommen könnte , ist (ksh93, mit
filefrag
vone2fsprogs
1.42.9 (einige älteren Versionen eine andere API), auf Umfang basierten Dateisysteme unter Linux):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, diefallocated
geschrieben, aber nicht geschrieben wurden.Neuere Versionen von
bsdtar
oderstar
können einige dieser APIs verwenden, um einetar
Datei 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.quelle