Journal Décompression d'archive intelligente

Posté par  .
Étiquettes : aucune
0
17
août
2006
Tout le monde a déjà eu le problème : on décompresse une archive dans un shell avec unzip, unrar ou tar ... et si l'archive est mal faite, on se retrouve avec plein de fichiers dans le répertoire courant. Après on passe une plombe a déplacer tous les fichiers dans un répertoire ...

Si cela vous agace à chaque fois (comme ça a été mon cas), voici ma solution simple à l'aide de scripts qui extraient dans tous les cas les fichiers dans un unique répertoire, basés pour le moment sur unzip, unrar et tar. Ils sont ici :
http://www.jerox.org/Data/ShellScripts/unzipToDir.sh
http://www.jerox.org/Data/ShellScripts/unrarToDir.sh
http://www.jerox.org/Data/ShellScripts/tarToDir.sh

Exemple avec un zip de nvidia :

$ wget http://download.nvidia.com/developer/SDK/Individual_Samples/(...)
$ unzip simple_framebuffer_object.zip
Archive: simple_framebuffer_object.zip
creating: DEMOS/

creating: inc/

creating: LIBS/


Cette archive pourrit notre répertoire courant ! Donc mieux vaut utiliser unzipToDir.sh à la place :

$ unzipToDir.sh simple_framebuffer_object.zip
simple_framebuffer_object dont exists, extracting simple_framebuffer_object.zip to it:
Archive: simple_framebuffer_object.zip
creating: simple_framebuffer_object/DEMOS/
...
creating: simple_framebuffer_object/inc/
  • # Heu... Et man ?

    Posté par  . Évalué à 10.

    Et un "unzip -l" pour vérifier que l'archive n'est pas faite n'importe comment...

    Ca marche aussi avec tar : "tar -tzvf" ou "tar -tjvf"

    unrar le fait aussi... "unrar l"

    Tu trouvera ton bonheur dans tout bon man... :)
  • # Tu rox

    Posté par  . Évalué à 1.

    C'est super bon comme truc, tu rox !
  • # Tar.

    Posté par  . Évalué à 3.

    Pourquoi ne pas vérifier le type mime de l'archive au lieu de tester si elle est compressée en bzip2 avec un switch de tar ?

    Simple question hein :)

    Bravo pour les scripts (même si je ne n'en vois pas non plus la nécéssité).
    • [^] # Re: Tar.

      Posté par  . Évalué à 8.

      Et pourquoi ne pas laisser tar se débrouiller ? Parce que je ne sais pas si c'est le cas partout, mais chez moi, un "tar xf fichier" me décompresse le fichier qu'il soit en bz2 ou en gz ou non compressé...
  • # Et pour récupérer un dé-tarrage foiré

    Posté par  . Évalué à 9.

    tar tfj monarchive.tar.bz2 | xargs rm -rf À ajuster avec z pour une archive gzippée. Bon, le rm -rf ça peut être un peu dangereux, à utiliser avec précaution (par exemple si l'archive contient des chemins absolus; normalement tar les enlève par défaut quand on crée une archive).
  • # Moi j'utilise ce script ...

    Posté par  (site web personnel) . Évalué à 2.

    J'utilise moi aussi un script pour décompresser les archives depuis Rox. C'est pas super car ça se base sur l'extension, pas sur le type MIME, mais ça marche bien en général.

    #!/bin/bash
    DIRNAME="$(dirname "$@")"
    FILENAME="$(basename "$@")"
    TYPE=`echo $FILENAME | sed 's/tar\.gz$/tgz/g' | sed 's/tar\.bz2$/tbz2/g' | sed 's/.*\.//g'`
    EXTENSION=`echo $FILENAME | sed 's/.*\.//'`
    if [ "$EXTENSION" = "bz2" ] || [ "$EXTENSION" = "gz" ]
    then
    EXTENSION="tar.$EXTENSION"
    fi

    DESTDIR="$(basename "$@" .$EXTENSION)"

    cd "$DIRNAME"
    case "$TYPE" in
    "zip")
    unzip -d "$DESTDIR" "$FILENAME"
    ;;
    "tar")
    mkdir "$DESTDIR"
    tar xf "$FILENAME" -C "$DESTDIR"
    ;;
    "tbz2")
    mkdir "$DESTDIR"
    tar xjf "$FILENAME" -C "$DESTDIR"
    ;;
    "tgz")
    mkdir "$DESTDIR"
    tar xzf "$FILENAME" -C "$DESTDIR"
    ;;
    "xpi")
    mkdir "$DESTDIR"
    unzip -d "$DESTDIR" "$FILENAME"
    ;;
    *)
    Xdialog --title "Unpack" --msgbox "Extension inconnue" 7 50
    ;;
    esac
    • [^] # Re: Moi j'utilise ce script ...

      Posté par  (site web personnel) . Évalué à 2.

      Hmm ok, j'avais pas fait attention. Mon script crée un nouveau répertoire même si l'archive est faite proprement, ce qui fait qu'on se retrouve avec filename/filename/...
      Après correction à l'aide de tes scripts, c'est vrai que c'est mieux :)
      • [^] # Re: Moi j'utilise ce script ...

        Posté par  . Évalué à 1.

        Pourrai-tu redonner le script corrigé?

        Merci d'avance
        • [^] # Re: Moi j'utilise ce script ...

          Posté par  (site web personnel) . Évalué à 2.

          #!/bin/bash
          DIRNAME="$(dirname "$@")"
          FILENAME="$(basename "$@")"
          TYPE=`echo $FILENAME | sed 's/tar\.gz$/tgz/g' | sed 's/tar\.bz2$/tbz2/g' | sed 's/.*\.//g'`
          EXTENSION=`echo $FILENAME | sed 's/.*\.//'`
          if [ "$EXTENSION" = "bz2" ] || [ "$EXTENSION" = "gz" ]
          then
          EXTENSION="tar.$EXTENSION"
          fi

          DESTDIR="$(basename "$@" .$EXTENSION)"

          cd "$DIRNAME"
          case "$TYPE" in

          "zip")
          DIRTEST=`unzip -lqq "$FILENAME" | awk '{print $4}' | sed -e 's,\/.*,,' | sort | uniq | wc -l`
          if [ $DIRTEST = "1" ]; then
          unzip "$FILENAME"
          else
          unzip -d "$DESTDIR" "$FILENAME"
          fi
          ;;

          "tar")
          DIRTEST=`tar -tvf "$FILENAME" | awk '{print $6}' | sed -e 's,\/.*,,' | sort | uniq | wc -l`
          if [ $DIRTEST = "1" ]; then
          tar xf "$FILENAME"
          else
          mkdir "$DESTDIR"
          tar xf "$FILENAME" -C "$DESTDIR"
          fi
          ;;

          "tbz2")
          DIRTEST=`tar tvjf "$FILENAME" | awk '{print $6}' | sed -e 's,\/.*,,' | sort | uniq | wc -l`
          if [ $DIRTEST = "1" ]; then
          tar xjf "$FILENAME"
          else
          mkdir "$DESTDIR"
          tar xjf "$FILENAME" -C "$DESTDIR"
          fi
          ;;

          "tgz")
          DIRTEST=`tar tvzf "$FILENAME" | awk '{print $6}' | sed -e 's,\/.*,,' | sort | uniq | wc -l`
          if [ $DIRTEST = "1" ]; then
          tar xzf "$FILENAME"
          else
          mkdir "$DESTDIR"
          tar xzf "$FILENAME" -C "$DESTDIR"
          fi
          ;;

          "xpi")
          mkdir "$DESTDIR"
          unzip -d "$DESTDIR" "$FILENAME"
          ;;

          "rar")
          DIRTEST=`unrar vb "$FILENAME" | sed -e 's,\/.*,,' | sort | uniq | wc -l`
          if [ $DIRTEST = "1" ]; then
          unrar "$FILENAME"
          else
          unrar "$FILENAME" "$DESTDIR"
          fi
          ;;

          *)
          Xdialog --title "Unpack" --msgbox "Extension inconnue" 7 50
          ;;

          esac
  • # Astuces

    Posté par  . Évalué à 4.

    Tu pourrais rajouter ça dans la section astuces du site , non ?
    • [^] # Re: Astuces

      Posté par  . Évalué à 1.

      Je peux savoir ce que j'ai dit de mal.

      Dans un journal, l'info va être perdue dans les limbes de l'historique alors qu'elle sera toujours accessible dans le classement des astuces.
    • [^] # Re: Astuces

      Posté par  . Évalué à 1.

      Bonne idée je le ferai quand mon script sera optimal :)
  • # Pour décompresser

    Posté par  (site web personnel) . Évalué à 3.

    je me rappel jamais des lettre à passé en paramettre de tar & compagnie, alors j'utilise simplement unfoo http://obsoleet.org/code/unfoo/
  • # libarchive + bsdtar

    Posté par  (site web personnel) . Évalué à 4.

    Pour limiter le nombre de scripts pourquoi ne pas utiliser libarchive et bsdtar. Il détecte le format de fichier et gère les format suivant pour le décompression :
    - tar
    - tar.gz
    - tar.bz2
    - tar.Z
    - cpio
    - cpio.gz
    - cpio.bz2
    - cpio.Z
    - zip
    - iso (iso9660)

    donc pour la décompression : une commande unique : tar xf :) et pour lister tar tf quelque soit le format supporté :)

    plus d'info ici : http://people.freebsd.org/~kientzle/libarchive/
    liste des formats supportés : http://people.freebsd.org/~kientzle/libarchive/libarchive-fo(...)

    pour l'autodétection du format de compression du tar : gz ou bz2 ou rien, je crois que les derniers gnu tar le font aussi.

    bsdtar est disponible chez tout les bon revendeurs :
    tous les bsd récents :)
    debian à partir de testing :
    http://packages.debian.org/cgi-bin/search_packages.pl?keywor(...)
    gentoo : http://packages.gentoo.org/search/?sstring=bsdtar
    Pour les autres, je vous laisse chercher.
    • [^] # Re: libarchive + bsdtar

      Posté par  . Évalué à 1.

      Merci du conseil je vais optimiser tout ca, mais c'est dommage que le rar ne soit pas supporté, je vais devoir garder au moins un script en plus.
      Parcontre l'idée est que le script marche idéalement partout sans rien ajouter au system donc c'est embettant d'utiliser des choses non standards.
    • [^] # Re: libarchive + bsdtar

      Posté par  (site web personnel) . Évalué à 2.

      Ou carrément app-arch/atool qui gère les formats susnommés mais aussi les tar.7z , les rpms , les arj et bien d'autres, le tout par le biais des utilitaires standards (c'est codé en perl par contre, mais ça a l'air relativement propre -_^).
  • # ça existe déjà

    Posté par  . Évalué à 3.

    http://www.penguin-soft.com/penguin/man/1/atool.html

    "aunpack machin.zip" a pour effet d'extraire les fichiers dans le répertoire machin s'il y a plusieurs répertoires/fichiers à la racine de l'archive ou dans le dossier courant s'il y a un seul répertoire racine dans l'archive.
    • [^] # Re: ça existe déjà

      Posté par  . Évalué à 1.

      Ouais pas mal ce tool en effet. Dommage que je ne l'ai pas trouvé avant.
  • # avec l'interface graphique

    Posté par  . Évalué à 2.

    Je viens de tester au niveau graphique avec file-roller (pour gnome) et si il y a un seul fichier dans l'archive, il l'extrait tel quel.
    Si l'archive contient plusieurs fichiers il va alors créer un répertoire <nomarchive>_FILES et les mettre dedans.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.