抽出されたtarファイルをもう一度小さくします。

抽出されたtarファイルをもう一度小さくします。

フォルダを.tar.gzアーカイブに圧縮しました。開梱すると、体積はほぼ2倍になります。

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

私はたくさん検索した結果、tarが実際にメタデータを追加したり、他の奇妙な操作を実行することによってこの問題を引き起こすことがわかりました。

md5sumだけでなく、フォルダ内のファイル2つを比較しました。まったく違いはなく、チェックサムはまったく同じ値です。ただし、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

私は他のアプローチを探しているのではなく、これらのファイルのサイズを元のサイズに戻す方法を探しています。

どうすればいいですか?

答え1

[この回答は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は次のようになります。足りない。アーカイブを作成するときは-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

答え2

@mosvyはファイルが希少であると指摘しました。再アーカイブしてtar --sparseタスクを抽出するか、次の操作を実行できます。ファイルシステムの既存のファイルを再稀にするには、次のコマンドを使用します。
fallocate -d
(util-linuxから)内部穴パンチング。

for f in **/*some*pattern*;do
    fallocate --dig-holes "$f"
done

これマニュアルページこのオプションを次のように説明してください。

このオプションを実行してcp --sparseから、追加のディスク領域を必要とせずに、ターゲットファイルの名前を元のファイルに変更することで処理できます。


Linuxのサポートfallocate(2)システムコールを使用すると、範囲を穴に置き換えるのではなく、ファイルのページサイズの穴を閉じたり拡大したりすることで、ファイルを減らしたり増やしたりするなど、素晴らしい機能を使用できます。これは、基本FSがさまざまなFallocate機能をそれぞれサポートしているかどうか、通常はスパースファイル/範囲をサポートしているかどうかによって異なります。

たとえば、断片化を防ぐために、急流をダウンロードする前に記録されていない範囲(ホールに似ていますがディスク容量を予約)を事前に割り当てることもできます。名前の「配布」はここに由来しています。

util-linuxを実行できる他のカーネルは、IDKというこの機能の一部または全部をサポートできます。それがうまくいかない場合cp --sparseたくさん事前に割り当てられた範囲、穴あけ、特に既存のデータ間の穴の拡大または縮小よりもはるかに優れています。

関連情報