Edit 2015
depuis util-linux 2.25, l' fallocateutilitaire sous Linux a une option -d/ --dig-holepour cela.
fallocate -d the-file
Creuserait un trou pour chaque bloc plein de zéros dans le fichier
Sur les anciens systèmes, vous pouvez le faire à la main: 
Linux a une FALLOC_FL_PUNCH_HOLEoption pour fallocatecela. J'ai trouvé un script sur github avec un exemple:
Utilisation de FALLOC_FL_PUNCH_HOLE depuis Python
Je l'ai un peu modifié pour faire ce que vous avez demandé - percer des trous dans des régions de fichiers remplis de zéros. C'est ici:
Utilisation de FALLOC_FL_PUNCH_HOLE à partir de Python pour percer des trous dans les fichiers
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
Exemple:
# 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
Notez que punch.pyne trouve que des blocs de 4096 octets à perforer, donc il se peut que le fichier ne soit pas aussi clairsemé qu'au début. Cela pourrait être rendu plus intelligent, bien sûr. De plus, il n'est que légèrement testé , alors faites attention et faites des sauvegardes avant de lui faire confiance!