Bearbeiten Sie 2015
ab util-linux 2.25 hat das dienstprogramm unter linux fallocate
eine -d
/ --dig-hole
option dafür.
fallocate -d the-file
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
usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]
Punch out the empty areas in a file, making it sparse
positional arguments:
FILE file(s) to modify in-place
optional arguments:
-h, --help show this help message and exit
-v VERBOSE, --verbose VERBOSE
be verbose
Beispiel:
# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2
# see that it has holes
$ du --block-size=1 --apparent-size test1
12288 test1
$ du --block-size=1 test1
8192 test1
# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288 test2
$ du --block-size=1 test2
12288 test2
# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288 test2
$ du --block-size=1 test2
8192 test2
# verify
$ cmp test1 test2 && echo "files are the same"
files are the same
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!