Edit 2015
pada util-linux 2.25, fallocate
utilitas di Linux memiliki -d
/ --dig-hole
opsi untuk itu.
fallocate -d the-file
Akan menggali lubang untuk setiap blok yang penuh dengan nol dalam file
Pada sistem yang lebih lama, Anda dapat melakukannya dengan tangan:
Linux memiliki FALLOC_FL_PUNCH_HOLE
opsi untuk fallocate
dapat melakukan ini. Saya menemukan skrip di github dengan contoh:
Menggunakan FALLOC_FL_PUNCH_HOLE dari Python
Saya memodifikasinya sedikit untuk melakukan apa yang Anda minta - membuat lubang di wilayah file yang diisi dengan nol. Ini dia:
Menggunakan FALLOC_FL_PUNCH_HOLE dari Python untuk membuat lubang pada 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
Contoh:
# 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
Perhatikan bahwa punch.py
hanya menemukan blok 4096 byte yang dapat dilempar keluar, sehingga mungkin tidak membuat file persis seperti ketika Anda mulai. Itu bisa dibuat lebih pintar, tentu saja. Juga, ini hanya diuji ringan , jadi hati-hati dan buat cadangan sebelum mempercayainya!