Вот еще одно решение. Он не позволит вам извлекать отдельные файлы из архива и уменьшать его размер, но он позволяет вам извлекать все файлы, уменьшая размер архива на ходу:
#!/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
был преобразован в разреженный файл той же длины, что и раньше, но со всеми нулями, которые не нужно хранить на диске.
Не используйте это в производстве, или где-нибудь, где удаление этого архива было бы плохо. Это делает архив нечитаемым, как только он запускается, поэтому, если что-то пойдет не так, например, если у вас не хватает места на жестком диске во время извлечения, у вас не будет второго шанса запустить это.