2015年編集
util-linux 2.25の時点で、fallocate
Linux のユーティリティには-d
/ --dig-hole
オプションがあります。
fallocate -d the-file
ファイル内のゼロで満たされたすべてのブロックに穴を掘ります
古いシステムでは、手動で実行できます。
Linuxにはこれを実行できるFALLOC_FL_PUNCH_HOLE
オプションがありますfallocate
。私はgithubで例を使ってスクリプトを見つけました:
PythonからFALLOC_FL_PUNCH_HOLEを使用する
あなたが尋ねたことをするためにそれを少し修正しました-ゼロで満たされたファイルの領域に穴を開けます。ここにあります:
PythonのFALLOC_FL_PUNCH_HOLEを使用してファイルに穴を開ける
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バイトのブロックのみを検出するため、開始時とまったく同じようにファイルがスパースにならない場合があることに注意してください。もちろん、よりスマートにすることもできます。また、簡単にテストされているだけなので、信頼する前に注意してバックアップを作成してください!