元々スパースだったファイルを再びスパースにすることはできますか?


29

スパースファイルを理解するユーティリティを使用せずに元々スパースファイルであったものをコピーまたは転送すると、「穴」が埋められることがわかります。かつてスパースファイルだったものをスパースに戻す方法やユーティリティはありますか?

例:
スパースファイルの作成:

% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

次の方法があります:

% resparse TEST2
to get:
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
  0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

申し訳ありませんが、元の
キュー

1
私が見たすべてからこれを行うことができる唯一のことは、GNU「cp」です、「%cp --sparse = always以前はスパースファイル、新たにスパースファイル」所定の位置に'。
user25849

スパースファイルをコピーして、コピーをスパースにする場合は、を使用しますrsync -aS
ジル 'SO-悪であるのをやめる

回答:


30

2015年編集

util-linux 2.25の時点で、fallocateLinux のユーティリティには-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バイトのブロックのみを検出するため、開始時とまったく同じようにファイルがスパースにならない場合があることに注意してください。もちろん、よりスマートにすることもできます。また、簡単にテストされているだけなので、信頼する前に注意してバックアップを作成してください


1
ファイル全体を再度書き換える必要がないため、これが最も気に入っています。
ピーター14

8

ファイルをスパースにしたい場合は、で直接行うことができますdd

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

dd(1)マニュアルから:

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

したがって、ブロック全体が空の場合にのみ先にシークすることに注意してください。最大のまばらさのために使用しますbs=1


2
bs=512ディスクはブロックデバイスであるため、ブロックサイズがこれより小さい場合は、実際には意味がありません。(bs=4096新しいドライブで)
lapo 14年

これは次と同等のようですcp --sparse=always zeropadded.iso isnowsparse.iso
-maxschlepzig

2

フラグ(GNU tarを想定)でtar-ingし-Sscp... no を再実行するのに 私が知っているユーティリティには、「穴」がどこにあるかを知る方法がありません。


5
GNU cpはファイルを再解析します:マニュアルページから:SOURCEファイルに十分な長さのゼロバイトシーケンスが含まれている場合は常に--sparse = alwaysを指定してスパースDESTファイルを作成します。
user25849

驚くばかり。毎日何かを学ぶ-その旗はいつ導入されましたか?「よく知られている」プログラムのマンページを時々読むために支払う; D
tink

2

私はこれで幸運に恵まれました:

cd whatever
rsync -avxWSHAXI . .

-I力は関係なく、それは彼らが変わってきたと考えているかどうかのか、すべてのファイルを更新するためにrsyncを。これ-Sにより、新しいファイルがスパース化されます。-a再帰的に実行するので、1つのコマンドでディレクトリツリー全体をスパース化できます。

穴を探し出し、それらを破壊するオーダーメイドのツールほど良くはありませんFALLOC_FL_PUNCH_HOLEが、ディレクトリツリー全体を複製するよりはましです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.