Modifica 2015
a partire da util-linux 2.25, l' fallocate
utility su Linux ha un'opzione -d
/ --dig-hole
per quello.
fallocate -d the-file
Scaverebbe un buco per ogni blocco pieno di zeri nel file
Sui sistemi più vecchi, puoi farlo a mano:
Linux ha FALLOC_FL_PUNCH_HOLE
un'opzione per fallocate
farlo. Ho trovato uno script su github con un esempio:
Utilizzo di FALLOC_FL_PUNCH_HOLE da Python
L'ho modificato un po 'per fare quello che mi hai chiesto: fai dei buchi in regioni di file piene di zeri. Ecco qui:
Utilizzo di FALLOC_FL_PUNCH_HOLE da Python per eseguire buchi nei file
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
Esempio:
# 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
Nota che punch.py
trova solo blocchi di 4096 byte da eseguire, quindi potrebbe non rendere un file esattamente sparso come lo era quando hai iniziato. Potrebbe essere reso più intelligente, ovviamente. Inoltre, è solo leggermente testato , quindi fai attenzione e fai backup prima di fidarti!