GNU/Linux >> Znalost Linux >  >> Linux

Zrušit archivaci a zároveň zmenšit velikost archivu?

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.


Linux
  1. Vytvořit archiv dehtu rozdělený na bloky maximální velikosti?

  2. Jak přidat/aktualizovat soubor do existujícího archivu Tar.gz?

  3. Chyba Tar:Neočekávané EOF v archivu

  1. Jak vytvořit archiv zip adresáře kompatibilní s Linuxem na počítači Mac

  2. Formát indexovaného archivu?

  3. tar:krátké čtení

  1. Jak rozdělit velký archiv „tar“ na více souborů určité velikosti

  2. Příkaz tar pro Linux

  3. Aktualizace jednoho souboru v komprimovaném taru