困境:我有一个 10GB 的存档和一个 20GB 的硬盘。当我去解压/解档文件时,硬盘已满,过程失败。
问题:在 ubuntu server 12.04 / linux 上,有没有办法可以解压文件同时减小存档的大小?
答案1
这是另一个解决方案。它不允许您从存档中提取单个文件并减小其大小,但它允许您提取所有文件,从而减小存档的大小:
#!/bin/sh
# $1, the first paramter, is the .tar.gz file to unarchive
(
size=$(wc -c $1)
offset=0
bs=4096
while [[ $size > $offset ]]; do
dd if=$1 bs=$bs count=1 skip=$offset status=none
fallocate -p -o $offset -l $bs $1
offset=$(( $offset + $bs ))
done
) | tar xz
将其保存到例如文件中untar_and_destroy.sh
并执行如下:
untar_and_destroy.sh whatever.tar.gz
这样做的目的是将.tar.gz
文件的一部分交给 tar,要求 Linux 释放文件的这一部分,然后重复执行下一部分。完成后,ls -l
会说.tar.gz
文件的大小与以前相同,但du
会将其大小报告为 0。这是因为文件.tar.gz
已被制成稀疏文件,长度与以前相同,但所有 0 都不需要存储在磁盘上。
不要在生产环境中或任何删除存档会造成不良影响的地方使用此功能。这会使存档在启动时无法读取,因此如果出现任何问题,例如提取时硬盘空间不足,您将没有第二次机会运行此功能。
答案2
我不知道有什么工具可以做到这一点,而且我认为任何常见的存档格式都不支持这一点。
解决您的问题的一个可能方法是将存档保存在另一台机器上,然后将其通过管道传输到要将其解压到的机器上。例如,您可以在有存档的机器上运行以下命令:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
档案将被传输到tar
服务器上运行的进程,该进程将对其进行解压缩,而无需档案存在于服务器上。
答案3
虽然扩展主存储可能不切实际,但您可以将文件内容提取到外部存储设备。
或者,生成存档中的文件列表,然后编写提取其中一些文件的脚本。将这些文件移动到云端,选择另一批文件进行提取、打泡、冲洗,然后重复。
但是,我所知道的每个存档应用程序都必须保留原始存档文件,同时创建一个不包含您不想要的内容的新存档文件,因此外部存储将非常非常有用。