Décompresser sous linux en ligne de commande


Si comme moi vous ne vous souvenez jamais de l’incantation magique qui permet de décompresser les fichiers tar.gz et autres linuxeries, voici un pense-bête:

tar xvf truc.tar # untar uniquement
tar xvzf truc.tar.gz # decompresse sur place
tar xvzf truc.tar.gz /chemin/vers/dossier # decompresse dans un dossier
tar jxf truc.tar.bz2 # decompresser bz2
gunzip truc.bz > truc # ungzip uniquement

Et pour les zip/tar, c’est unzip/untar, sans option. Mais il faut les installer à part.

23 thoughts on “Décompresser sous linux en ligne de commande

  • Gauthier Monserand

    – L’option f doit être spécifiée en dernier car c’est elle qui spécifie le fichier à décompresser (tar xvfz -> tar xvzf)
    – Pour les bz2 c’est l’option j et non y
    – Sachant que l’option j ou z est optionnelle :
    man tar:

    Note: When working with archives, specifying the compression option is often times unnecessary as tar will automatically detect the compression type based on the suffix of the archive.

  • Schnouki

    Avec les versions récentes de GNU tar il n’y a même plus besoin des -z, -j et -J pour .gz, .bz2 et .xz. Un simple “tar xvf machin.tar.gz” fonctionne. (C’est le cas avec le tar distribué par Arch Linux depuis au moins 2 ou 3 ans).
    BSD tar est encore mieux car il gère aussi les .zip de la même manière… (parfois dispo sous le nom “bsdtar” sous Linux)

  • Sam Post author

    D’ailleurs, si l’un d’entre vous sait comment faire marcher ce snippet pour les noms qui contiennent des espaces ou des ‘, je suis preneurs:

    extract () {
        if [ -f "'"$1"'" ] ; then
            case $1 in
                *.tar.bz2) tar xjf $1 ;;
                *.tar.gz) tar xzf $1 ;;
                *.bz2) bunzip2 $1 ;;
                *.rar) rar x $1 ;;
                *.gz) gunzip $1 ;;
                *.tar) tar xf $1 ;;
                *.tbz2) tar xjf $1 ;;
                *.tgz) tar xzf $1 ;;
                *.zip) unzip $1 ;;
                *.z) uncompress $1 ;;
                *) echo "'$1' cannot be extracted via extract ()" ;;
                esac
            else
                echo "'$1' is not a valid file"
        fi
    }
  • foxmask

    mon grin de sel. pour extraire un dossier/fichier d’une archive sans la télécharger intégralement :

    wget -q http://foo.bar/toto.tar.gz -O - |tar xvfz - dossier

  • Stéphane Péchard

    @Sam : moi j’ai

    xt () {
    	if [ -f $1 ]
    	then
    		case $1 in
    			(*.7z) 7z x $1 ;;
    			(*.lzma) unlzma $1 ;;
    			(*.rar) unrar x $1 ;;
    			(*.tar) tar xvf $1 ;;
    			(*.tar.bz2) tar xvjf $1 ;;
    			(*.bz2) bunzip2 $1 ;;
    			(*.tar.gz) tar xvzf $1 ;;
    			(*.gz) gunzip $1 ;;
    			(*.tar.xz) tar Jxvf $1 ;;
    			(*.xz) xz -d $1 ;;
    			(*.tbz2) tar xvjf $1 ;;
    			(*.tgz) tar xvzf $1 ;;
    			(*.zip) unzip $1 ;;
    			(*.Z) uncompress ;;
    			(*) echo "don't know how to extract '$1'..." ;;
    		esac
    	else
    		echo "Error: '$1' is not a valid file!"
    		exit 0
    	fi
    }

    et ça semble marcher avec des espaces…

  • François

    Le paquet unp (en perl, dans toutes les bonnes distribs) décompresse tout.
    Sinon, atool, mais je ne l’utilise pas.

  • floweb

    J’ai jamais pu me faire a ces commandes de sioux, j’utilise ça.

    C’est un paquet Debian, faut l’installer, mais après t’as une seule commande à retenir : unp tonbousin

  • TitusCrow

    (Suis-je le seul à ne pas pouvoir cliquer sur le lien proposé par floweb et caché par le tampon ?)

  • Max

    @titus j’ai viré le tampon, j’espère qu’il ne m’en voudra pas :)

  • JEEK

    Sam&Max, le site où on aime prendre de gros tampons… héhé’ ;-)

    Bon, je ne connaissais même pas unp…
    …encore un soir où j’vais me coucher moins con ; putain, j’adore le web (c’est pas avec la TV que j’aurais ça tiens) !

  • Baronsed

    Marrant, mais moi je dois utiliser -C pour donner un autre répertoire que le répertoire courant.

  • Sam Post author

    De rien pour ce petit rappel.
    Bonne continuation à toi seul :-)

  • Max

    Encore merci et bonne chance, nous sommes de tout coeur avec vous…

    Celui qui trouve l’origine de cette réplique a un tampon :) (sauf sam)

  • Akarun

    Je plusois @Baronsed : moi aussi, je dois utiliser “-C” pour donner un autre répertoire de destination. Sinon il tente de trouver le répertoire (ou le fichier) dans l’archive.

    tar xvzf truc.tar.gz /
    chemin/dans/l-archive/fichier-a-extraire.txt /
    -C chemin/vers/dossier/de/destination

    Aka

    ps: Peut-être faut-il faire la différence entre chemin relatif et absolu?

  • Baronsed

    AH !
    Encore mieux que unp : dtrx (do the right extract) ; gère :
    – les formats (bon c’est le but à a la base)
    – les droits <3
    – et quand un connard met une blinde de fichiers à la racine de son archive <3 <3, il crée exprès un dossier pour ça.

    Et si jamais on tombe sur un rép préalablement pourri o/ :
    https://alias.sh/undo-unzip

    Cela dit, ça peut être utile de garder une version commentée de xt() dans son .bashrc pour les cas où on ne peut pas installer ce qu'on veut, etc.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.