
Stellen Sie sich eine Datei vor, die mit folgendem erstellt wurde:
truncate -s1T file
echo test >> file
truncate -s2T file
Ich habe jetzt eine 2 Tebibyte große Datei (die 4 KiB auf der Festplatte einnimmt), "test\n"
in deren Mitte steht:
Wie kann ich das "test"
effizient wiederherstellen, ohne die gesamte Datei lesen zu müssen?
tr -d '\0' < file
Würde mir das Ergebnis liefern, aber das würde Stunden dauern.
Was ich möchte, ist etwas, das nur die nicht-spärlichen Teile der Datei ausgibt (also nur "test\n"
das Obige oder wahrscheinlicher den auf der Festplatte zugewiesenen 4-KiB-Block, der diese Daten speichert).
Es gibt APIs, um herauszufinden, welcher Teil der Dateizugeteilt(FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA...), aber welche Tools stellen diese bereit?
Eine portable Lösung (zumindest für die Betriebssysteme, die diese APIs unterstützen) wäre wünschenswert.
Antwort1
Das Beste, was mir bisher eingefallen ist, ist (ksh93, verwendet filefrag
ab e2fsprogs
1.42.9 (einige ältere Versionen haben eine andere API), auf extentbasierten Dateisystemen 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 die Ausmaße der Datei mithilfe des FIEMAP-ioctl für die Dateisysteme, die dies unterstützen.
Der *unwritten*
Teil deckt die (nicht spärlich besetzten, aber immer noch voller Nullen, die mich nicht interessieren) Dateien ab, die vorhanden, fallocated
aber nicht beschrieben wurden.
Neuere Versionen von bsdtar
oder star
können einige dieser APIs verwenden, um eine tar
Datei zu generieren, die die spärlichen Abschnitte als solche identifiziert. Das würde zu einertragbarLösung, aber dann müsste man die generierte TAR-Datei analysieren, um die nicht spärlichen Abschnitte zu erhalten.