在减小存档大小的同时取消存档文件?

Eth*_*lis 6 linux tar archiving

困境:我有一个 10GB 的存档和一个 20GB 的硬盘。当我解压缩/解压缩文件时,硬盘驱动器已满并且该过程失败。

问题:在 ubuntu 服务器 12.04 / linux 上,有没有一种方法可以在减小存档大小的同时取消存档文件?

win*_*ner 6

这是另一种解决方案。它不会让您从存档中提取单个文件并减小其大小,但它可以让您随时提取所有文件并减小存档的大小:

#!/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
Run Code Online (Sandbox Code Playgroud)

将其保存到一个类似 eg 的文件中untar_and_destroy.sh并执行为:

untar_and_destroy.sh whatever.tar.gz
Run Code Online (Sandbox Code Playgroud)

这样做是将.tar.gz文件的一部分提供给 tar,要求 Linux 释放文件的那部分,然后对下一部分重复。完成后,ls -l会说.tar.gz文件的大小与之前相同,但du会报告其大小为 0。这是因为.tar.gz已将其制作为稀疏文件,长度与之前相同,但全部为 0 不需要存储到磁盘上。

不要在生产中使用它,或者在删除存档会很糟糕的任何地方使用它。这使得存档一开始就无法读取,因此如果出现任何问题,例如您在提取时硬盘空间不足,您将没有第二次运行它的机会。