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.