Zde je další řešení. Neumožní vám to extrahovat jednotlivé soubory z archivu a zmenšit jeho velikost, ale umožní vám extrahovat všechny soubory a zmenšit velikost archivu za pochodu:
#!/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
Uložte to do souboru jako např. untar_and_destroy.sh
a spustit jako:
untar_and_destroy.sh whatever.tar.gz
Co to udělá, je dát část .tar.gz
file to tar, požádá Linux, aby uvolnil tuto část souboru, a pak to opakuje pro další část. Až budete hotovi, ls -l
řekne .tar.gz
soubory mají stejnou velikost jako dříve, ale du
bude hlásit svou velikost jako 0. Je to proto, že .tar.gz
byl vytvořen jako řídký soubor se stejnou délkou jako předtím, ale jako všechny 0, které není třeba ukládat na disk.
Nepoužívejte to v produkci nebo kdekoli, kde by odstranění archivu bylo špatné. Tím se archiv stává nečitelným hned po spuštění, takže pokud se něco pokazí, např. když vám během rozbalování dojde místo na pevném disku, nebudete mít druhou šanci to spustit.
Ačkoli může být nepraktické rozšířit primární úložiště, možná byste mohli extrahovat obsah souboru na externí úložné zařízení.
Případně vygenerujte seznam souborů v archivu a poté napište skript, který některé z nich extrahuje. Přesuňte tyto soubory do cloudu, vyberte jinou dávku, kterou chcete extrahovat, napěňte, opláchněte a opakujte.
Ale každá archivační aplikace, o které vím, musí mít původní archivní soubor neporušený, zatímco vytváří nový archivní soubor bez toho, co nechcete, takže externí úložiště bude velmi, velmi užitečné.
Neznám žádné nástroje, které by to dokázaly, a nemyslím si, že by to podporoval žádný z běžných archivačních formátů.
Jedním z možných řešení vašeho problému by bylo ponechat archiv na jiném počítači a přenést ho na počítač, na který jej chcete dekomprimovat. Můžete například spustit tento příkaz na počítači s archivem:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
Archiv bude streamován do tar
proces běžící na serveru, který jej dekomprimuje, aniž by musel být archiv na serveru někdy přítomen.