Eth*_*lis 6 linux tar archiving
困境:我有一个 10GB 的存档和一个 20GB 的硬盘。当我解压缩/解压缩文件时,硬盘驱动器已满并且该过程失败。
问题:在 ubuntu 服务器 12.04 / linux 上,有没有一种方法可以在减小存档大小的同时取消存档文件?
这是另一种解决方案。它不会让您从存档中提取单个文件并减小其大小,但它可以让您随时提取所有文件并减小存档的大小:
#!/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 不需要存储到磁盘上。
不要在生产中使用它,或者在删除存档会很糟糕的任何地方使用它。这使得存档一开始就无法读取,因此如果出现任何问题,例如您在提取时硬盘空间不足,您将没有第二次运行它的机会。