3 votes

Commande shell UNIX pour décompresser des fichiers de n'importe quel type compressé

Existe-t-il une commande shell UNIX pour étendre un fichier compressé dont le type n'est pas connu à l'avance?

Je devrais être en mesure d'utiliser cette commande pour étendre au moins l'un des types de fichiers suivants, bien que la possibilité de travailler avec d'autres types connus (comme .rar ou .7z) soit la bienvenue:

  • tar
  • tar.gz
  • tgz
  • gz
  • gzip
  • bz2
  • zip

Des idées plus simples impliquant des commandes en une seule ligne seraient les meilleures solutions, mais tout commentaire est apprécié.

6voto

Randy6T9 Points 1606

Il n'est pas si difficile d'écrire un tel script, mais il faut être un peu prudent. Le problème est que les fichiers zip sont comme des fichiers tar compressés et en les dézippant, on extrait les fichiers. Tous les fichiers compressés avec gzip, bzip2 ou xz ne sont pas nécessairement des fichiers tar en dessous (bien sûr, un fichier .tar.bz2 l'est ; tout comme un fichier .tgz). Vous devez donc définir ce que vous voulez faire avec un simple fichier .gz, et si vous voulez toujours un fichier tar détaré.

Étant donné ce préambule, vous pouvez écrire un script comme:

#!/bin/sh

# Remplacez éventuellement les commandes par défaut
: ${GZIP:=gzip}
: ${TAR:=tar}
: ${BZIP2:=bzip2}
: ${XZ:=xz}
: ${UNZIP:=unzip}

for file in "$@"
do
    case "$file" in
    (*.tar.gz|*.tgz|*.tar)
        $TAR -xf "$file";;
    (*.tar.xz)
        $XZ -cd "$file" | $TAR -xf -;;
    (*.xz)
        $XZ -d "$file";;
    (*.gz)
        $GZIP -d "$file";;
    (*.tar.bz2)
        $TAR -xf "$file";;
    (*.bz2)
        $BZIP2 -d "$file";;
    (*.zip)
        $UNZIP "$file";;
    (*) echo "$0: type de fichier non reconnu $file" >&2;;
    esac
done

Il n'y a pas grand-chose de compliqué là-dedans. Je suppose que votre version de tar reconnaît automatiquement les fichiers gzip et bzip2; sinon, vous devez faire plus ou moins comme je l'ai fait pour xz. Il y a aussi une option --use-compress-program=XXX pour GNU tar, mais toutes les variantes de tar ne la reconnaissent pas. Vous pouvez clairement ajouter plus de motifs et de (dé)compresseurs selon vos besoins. Reconnaître les fichiers CPIO et shar ne serait pas si compliqué. La liste est longue.

La plupart des gens ne se donnent pas la peine d'écrire un tel script. Par exemple, je vérifie généralement le contenu du fichier avant de l'extraire réellement. Vous pourriez ajouter une gestion des arguments au script pour permettre une sortie verbeuse, ou une liste au lieu d'une extraction (-t pour tar; -l pour unzip) et éventuellement la verbosité.

Un peu plus difficile serait d'identifier le type de fichier lorsque le suffixe n'est pas reconnu. Vous pourriez exécuter la commande file sur le fichier et analyser ce qu'elle dit. Une autre possibilité est d'analyser si le contenu du fichier sera placé dans un sous-répertoire ou non ; si ce n'est pas le cas, vous pourriez créer un sous-répertoire puis extraire le contenu dans le sous-répertoire. Les possibilités sont nombreuses.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X