Chỉnh sửa 2015
kể từ phiên bản linux 2.25, fallocate
tiện ích trên Linux có tùy chọn -d
/ --dig-hole
cho điều đó.
fallocate -d the-file
Sẽ đào một lỗ cho mọi khối đầy số không trong tệp
Trên các hệ thống cũ hơn, bạn có thể làm điều đó bằng tay:
Linux có một FALLOC_FL_PUNCH_HOLE
tùy chọn để fallocate
có thể làm điều này. Tôi tìm thấy một tập lệnh trên github với một ví dụ:
Sử dụng FALLOC_FL_PUNCH_HOLE từ Python
Tôi đã sửa đổi nó một chút để làm những gì bạn yêu cầu - đục lỗ trong các vùng của tệp chứa đầy số không. Đây là:
Sử dụng FALLOC_FL_PUNCH_HOLE từ Python để đục lỗ trong các tệp
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
Thí dụ:
# 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
Lưu ý rằng punch.py
chỉ tìm thấy các khối 4096 byte để đục lỗ, vì vậy nó có thể không tạo ra một tệp chính xác như khi bạn bắt đầu. Nó có thể được làm thông minh hơn, tất nhiên. Ngoài ra, nó chỉ được thử nghiệm nhẹ , vì vậy hãy cẩn thận và tạo bản sao lưu trước khi tin tưởng nó!