使提取的 tar 文件再次变小

使提取的 tar 文件再次变小

我将一个文件夹打包并压缩为 .tar.gz 存档。拆开包装后,体积几乎是原来的两倍。

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

我搜索了很多,发现 tar 实际上是通过添加元数据或用它做其他奇怪的事情而导致这个问题的。

我对文件夹内的 2 个文件以及 md5sum 进行了比较。绝对没有差异,并且校验和是完全相同的值。然而,一个文件的大小是原始文件的两倍。

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.1M    /path/to/old/folder/subfolder/file.mcapm
2.4M    /path/to/extracted/folder/subfolder/file.mcapm

.mcapm文件可能是。创建存档时使用-S( --sparse)选项。tar

例子:

$ 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 功能,当然还有一般的稀疏文件/范围。

它还允许您预先分配未写入的范围(如孔,但在磁盘上保留空间),例如在下载 torrent 之前以避免碎片。这就是名称中“分配”的由来。

util-linux 可以运行的其他内核可能支持部分或全部此功能,IDK。如果不起作用的话cp --sparse很多比预先分配的范围、打孔,或者特别是在现有数据之间扩展或折叠孔远得多。

相关内容