web-dev-qa-db-ja.com

成長した抽出されたtarファイルを再び小さくする

フォルダを.tar.gzアーカイブにパックして圧縮しました。開梱後は、ほぼ2倍の大きさでした。

du -sh /path/to/old/folder       = 263M
du -sh /path/to/extracted/folder = 420M

私はたくさん検索しましたが、メタデータを追加したり、他の奇妙なことをしたりすることで、タールが実際にこの問題を引き起こしていることがわかりました。

フォルダー内の2つのファイルとmd5sumの差分を作成しました。差分はまったくなく、チェックサムはまったく同じ値です。ただし、1つのファイルのサイズは元のファイルの2倍です。

root@server:~# du -sh /path/to/old/folder/subfolder/file.mcapm /path/to/extracted/folder/subfolder/file.mcapm
1.1M    /path/to/old/folder/subfolder/file.mcapm
2.4M    /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# diff /path/to/old/folder/subfolder/file.mcapm /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# 
root@server:~# md5sum /path/to/old/folder/subfolder/file.mcapm
root@server:~# f11787a7dd9dcaa510bb63eeaad3f2ad
root@server:~# md5sum /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# f11787a7dd9dcaa510bb63eeaad3f2ad

別の方法を探すのではなく、それらのファイルのサイズを元のサイズに戻す方法を探しています。

どうすればそれを達成できますか?

10
Permittivity

[この答えは、GNU tarおよびGNU cp]と仮定しています)

差分はまったくなく、チェックサムはまったく同じ値です。ただし、1つのファイルのサイズは元のファイルの2倍です。

1.1M    /path/to/old/folder/subfolder/file.mcapm
2.4M    /path/to/extracted/folder/subfolder/file.mcapm

その.mcapmファイルはおそらく sparse です。アーカイブを作成するときは、-S--sparsetarオプションを使用します。

例:

$ dd if=/dev/null seek=100 of=dummy
...
$ mkdir extracted

$ tar -zcf dummy.tgz dummy
$ tar -C extracted -zxf dummy.tgz
$ du -sh dummy extracted/dummy
0       dummy
52K     extracted/dummy

$ tar -S -zcf dummy.tgz dummy
$ tar -C extracted -zxf dummy.tgz
$ du -sh dummy extracted/dummy
0       dummy
0       extracted/dummy

後でcp --sparse=alwaysを使用してファイルを「再スパース」することもできます。

$ dd if=/dev/zero of=junk count=100
...
$ du -sh junk
52K     junk
$ cp --sparse=always junk junk.sparse && mv junk.sparse junk
$ du -sh junk
0       junk
22
mosvy