Ich weiß, dass das Kopieren oder Übertragen einer ursprünglich spärlichen Datei ohne ein Hilfsprogramm, das spärliche Dateien versteht, dazu führt, dass die "Löcher" ausgefüllt werden. Gibt es eine Methode oder ein Hilfsprogramm, um eine ehemals dünn besetzte Datei wieder in dünn zu verwandeln?
Zum Beispiel:
Sparse-Datei erstellen:
% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
Gibt es einen Weg zu:
% resparse TEST2
to get:
0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2
files
utilities
sparse-files
user25849
quelle
quelle
rsync -aS
.Antworten:
Bearbeiten Sie 2015
ab util-linux 2.25 hat das dienstprogramm unter linux
fallocate
eine-d
/--dig-hole
option dafür.Würde für jeden Block voller Nullen in der Datei ein Loch graben
Auf älteren Systemen können Sie dies von Hand tun:
Linux hat eine
FALLOC_FL_PUNCH_HOLE
Option,fallocate
die dies tun kann. Ich habe ein Skript auf Github mit einem Beispiel gefunden:Verwendung von FALLOC_FL_PUNCH_HOLE aus Python
Ich habe es ein wenig modifiziert, um das zu tun, worum Sie gebeten haben - Löcher in Bereiche von Dateien zu stanzen, die mit Nullen gefüllt sind. Hier ist es:
Verwenden von FALLOC_FL_PUNCH_HOLE aus Python, um Löcher in Dateien zu stanzen
Beispiel:
Beachten Sie, dass
punch.py
nur Blöcke mit 4096 Bytes zum Ausstanzen gefunden werden, sodass eine Datei möglicherweise nicht genau so dünn wie zu Beginn ist. Es könnte natürlich schlauer gemacht werden. Außerdem ist es nur leicht getestet , seien Sie also vorsichtig und machen Sie Backups, bevor Sie ihm vertrauen!quelle
Wenn Sie eine Datei sparsam machen möchten, können Sie dies direkt mit tun
dd
.Aus dem
dd(1)
Handbuch:Beachten Sie also, dass nur dann nach vorne gesucht wird, wenn der gesamte Block leer ist. Für maximale Sparsamkeit verwenden
bs=1
.quelle
bs=512
ist nicht wirklich sinnvoll, da Festplatten Blockgeräte sind. (bs=4096
in neueren Laufwerken)cp --sparse=always zeropadded.iso isnowsparse.iso
Es
tar
fehlt ein-S
Flag (unter der Annahme von GNU-Teer), und es wird erneut ausgeführtscp
... nein. Kein Dienstprogramm, von dem ich weiß, hätte eine Möglichkeit zu wissen, wo die "Löcher" waren.quelle
Ich hatte viel Glück damit:
Das
-I
erzwingt, dass rsync alle Dateien aktualisiert, unabhängig davon, ob es denkt, dass sie geändert wurden oder nicht. Das-S
bewirkt, dass die neuen Dateien sparsifiziert werden.-a
Dies geschieht rekursiv, sodass Sie ganze Verzeichnisbäume in einem Befehl sparsifizieren können.Es ist nicht so gut wie ein maßgeschneidertes Tool, das Löcher ausfindig macht und sie damit zerstört
FALLOC_FL_PUNCH_HOLE
, aber es ist besser, als ganze Verzeichnisbäume zu duplizieren.quelle