แก้ไขปี 2015
ตั้งแต่ util-linux 2.25, fallocate
ยูทิลิตี้บน Linux มีตัวเลือก-d
/ a--dig-hole
fallocate -d the-file
จะขุดหลุมสำหรับทุกบล็อกที่เต็มไปด้วยเลขศูนย์ในไฟล์
ในระบบเก่าคุณสามารถทำได้ด้วยตัวเอง:
Linux มีFALLOC_FL_PUNCH_HOLE
ตัวเลือกให้fallocate
ทำเช่นนั้นได้ ฉันพบสคริปต์บน github พร้อมตัวอย่าง:
ใช้ FALLOC_FL_PUNCH_HOLE จาก Python
ฉันปรับเปลี่ยนเล็กน้อยเพื่อทำสิ่งที่คุณถาม - เจาะรูในพื้นที่ของไฟล์ที่เต็มไปด้วยเลขศูนย์ นี่มันคือ:
ใช้ FALLOC_FL_PUNCH_HOLE จาก Python เพื่อเจาะรูในไฟล์
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
ตัวอย่าง:
# 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
โปรดทราบว่าpunch.py
จะค้นหาบล็อกที่มีความยาว 4096 ไบต์เท่านั้นดังนั้นจึงอาจไม่สร้างไฟล์ที่กระจัดกระจายเหมือนกับตอนที่คุณเริ่มต้น มันอาจทำให้ฉลาดขึ้นแน่นอน นอกจากนี้ยังมีการทดสอบเพียงเล็กน้อยดังนั้นควรระมัดระวังและทำการสำรองข้อมูลก่อนที่จะเชื่อถือได้!