Editar 2015
a partir de util-linux 2.25, la fallocate
utilidad en Linux tiene una opción -d
/ --dig-hole
para eso.
fallocate -d the-file
Cavaría un hoyo por cada bloque lleno de ceros en el archivo
En sistemas más antiguos, puede hacerlo a mano:
Linux tiene una FALLOC_FL_PUNCH_HOLE
opción fallocate
que puede hacer esto. Encontré un script en github con un ejemplo:
Usando FALLOC_FL_PUNCH_HOLE de Python
Lo modifiqué un poco para hacer lo que pediste: perforar agujeros en regiones de archivos que están llenos de ceros. Aquí está:
Usando FALLOC_FL_PUNCH_HOLE de Python para hacer agujeros en los archivos
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
Ejemplo:
# 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
Tenga en cuenta que punch.py
solo encuentra bloques de 4096 bytes para perforar, por lo que es posible que no haga que un archivo sea tan escaso como cuando comenzó. Podría hacerse más inteligente, por supuesto. Además, solo está ligeramente probado , así que tenga cuidado y haga copias de seguridad antes de confiar en él.