Télécharger et décompresser des ZIP, tar.gz et gzip avec cURL
Redirigez la sortie de cURL vers tar ou gzip pour décompresser un téléchargement au fur et à
mesure de son arrivée. Pour les fichiers ZIP, téléchargez d’abord vers un fichier temporaire, puis exécutez
unzip. Les exemples ci-dessous vérifient à la fois le téléchargement et l’extraction, et refusent de
réutiliser un répertoire de sortie existant.
Commandes cURL de base pour le téléchargement
Utilisez Bash sous Linux, cURL, GNU tar, GNU gzip, Info-ZIP UnZip et les utilitaires standard mkdir,
mktemp et rm. Les commandes ont été testées sur Ubuntu 24.04 avec Bash 5.2, cURL 8.5.0,
GNU tar 1.35, gzip 1.12 et UnZip 6.00. Il ne s’agit pas de commandes PowerShell ni de commandes
sh génériques.
Choisissez le bloc correspondant à votre format et remplacez son URL https://example.com/… par une URL de
téléchargement fiable. Exécutez le bloc complet, parenthèses comprises, dans Bash depuis un répertoire
qui vous appartient et dans lequel vous pouvez écrire. Chaque bloc est autonome. Vous pouvez aussi en
enregistrer un sous le nom extract.sh et exécuter bash extract.sh.
Les options cURL utilisées ici sont :
-f: renvoie une erreur en cas d’échec HTTP, par exemple 404, sans transmettre la page d’erreur à l’extracteur.-sS: masque l’indicateur de progression tout en affichant les erreurs.-L: suit les redirections.-o: écrit le téléchargement dans le fichier indiqué au lieu de la sortie standard.
Le répertoire de sortie ne doit pas exister, même s’il est vide. mkdir le réserve avant le
début de tout téléchargement ; ne remplacez pas cette commande par mkdir -p. Le trap de nettoyage
n’est installé qu’une fois la création réussie : une commande répétée laisse donc le résultat précédent
intact. umask 077 rend les répertoires de travail nouvellement créés privés pour votre utilisateur,
même si les entrées d’archive peuvent porter leurs propres modes.
Gérer les différents formats d’archive
Archives Zip (.zip)
Info-ZIP UnZip 6.0 ne lit pas d’archive depuis stdin. Son option -p envoie les fichiers extraits
vers stdout ; elle n’accepte pas en entrée un ZIP transmis par un pipe. Le
manuel d’UnZip documente cette limitation. Utilisez un fichier téléchargé ordinaire
pour que l’extracteur puisse s’y positionner librement.
(
umask 077
dest='./zip-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
work=$(mktemp -d) || exit
trap 'rm -rf -- "$work" "$dest"' EXIT
curl -fsSL 'https://example.com/archive.zip' -o "$work/archive.zip" || exit
unzip -q "$work/archive.zip" -d "$dest" </dev/null || exit
rm -rf -- "$work" || exit
trap - EXIT
printf 'Extracted to %s\n' "$dest"
)
En cas de réussite, les fichiers se trouvent sous ./zip-output/, avec leur arborescence d’archive intacte.
mktemp -d crée un répertoire temporaire unique dans $TMPDIR, ou dans /tmp si cette variable
n’est pas définie. Seule cette copie privée de archive.zip est supprimée. Un fichier nommé
temp.zip dans votre répertoire courant n’est jamais utilisé. Cet exemple concerne les fichiers ZIP
non chiffrés ; la fermeture de stdin empêche une invite de saisie interactive de bloquer la commande.
Archives tar gzip (.tar.gz ou .tgz)
Une archive tar compressée avec gzip peut être transmise en flux directement à GNU tar :
(
set -o pipefail
umask 077
dest='./tar-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
curl -fsSL 'https://example.com/archive.tar.gz' | tar -xzf - -C "$dest" || exit
trap - EXIT
printf 'Extracted to %s\n' "$dest"
)
Ici, -x extrait, -z décompresse le gzip, -f - lit l’archive depuis stdin et
-C choisit le répertoire d’extraction. Les fichiers arrivent sous ./tar-output/ ; aucune archive
compressée n’est enregistrée. Si l’archive contient un répertoire de premier niveau, ce répertoire
reste à l’intérieur de tar-output.
L’option pipefail de Bash fait échouer le pipeline lorsque cURL ou tar
échoue. Sans elle, un extracteur qui réussit peut masquer un transfert échoué, même un transfert qui
signale une erreur après avoir livré des octets d’archive exploitables. Le || exit renvoie le
code d’échec depuis le sous-shell et déclenche le nettoyage. Les parenthèses empêchent ces paramètres
du shell et les appels à exit d’affecter votre session interactive.
Archives gzip (.gz)
Le gzip simple compresse un flux d’octets ; il ne fournit pas d’arborescence de répertoires.
Choisissez explicitement le nom du fichier de sortie avec gzip -dc et une redirection :
(
set -o pipefail
umask 077
dest='./gzip-output'
mkdir -- "$dest" || exit
trap 'rm -rf -- "$dest"' EXIT
curl -fsSL 'https://example.com/file.gz' | gzip -dc > "$dest/payload" || exit
trap - EXIT
printf 'Decompressed to %s/payload\n' "$dest"
)
-d décompresse et -c écrit vers stdout. Le résultat est ./gzip-output/payload, y compris
lorsque le fichier d’origine est vide ou contient des données binaires. Le répertoire englobant
empêche la redirection de tronquer un résultat plus ancien. Si un fichier nommé .gz contient
en réalité une archive tar, utilisez l’exemple tar avec cette URL pour en extraire les membres.
Considérations de sécurité
Utilisez ces commandes, en tant qu’utilisateur normal, pour des archives provenant d’une source de
confiance. Le nouveau répertoire protège la sortie existante d’une réutilisation accidentelle ; ce
n’est pas un bac à sable. Les chemins de l’archive, les liens, les permissions, les vulnérabilités
de l’extracteur et une taille décompressée excessive restent des risques à prendre en compte. Les
recommandations de sécurité de GNU tar expliquent les risques liés à
l’extraction d’archives non fiables. --strip-components modifie la disposition des chemins ; cela ne rend
pas sûre une archive arbitraire.
Le streaming commence à écrire des fichiers avant la fin du transfert. Attendez un code de sortie nul et le message de réussite avant de les utiliser. En cas d’erreur de téléchargement ou d’extraction, le trap supprime le répertoire de sortie nouvellement créé. Une interruption forcée ou une erreur de permission lors du nettoyage peut laisser des fichiers partiels ; inspectez ce répertoire avant de choisir une nouvelle destination pour une nouvelle tentative.
Pièges courants et conseils de dépannage
- La destination existe déjà : choisissez un nouveau nom pour
dest. La commande échoue volontairement avant le téléchargement, ce qui préserve le répertoire, le fichier ou le lien symbolique existant. - cURL signale une erreur HTTP ou de connexion : vérifiez l’URL de téléchargement et les conditions d’accès. Une page web renvoyant HTTP 200 n’est pas pour autant une archive ; l’extracteur doit aussi accepter le contenu téléchargé.
- L’extracteur signale une fin de fichier inattendue (EOF), une erreur de somme de contrôle ou un
format invalide : considérez le résultat comme un échec. Vérifiez le format et obtenez une copie
complète auprès de l’éditeur. Un suffixe
.gzne suffit pas à lui seul à indiquer si son contenu est une archive tar. - Un transfert s’interrompt sans cesse : relancez le bloc entier après avoir résolu la cause. N’ajoutez pas simplement des options de nouvelle tentative à un pipe : cURL ne peut pas annuler l’envoi des octets déjà transmis en aval. Sa documentation sur les nouvelles tentatives avertit qu’une sortie redirigée peut recevoir des données en double.
- L’extraction manque d’espace : prévoyez de la place pour les fichiers décompressés. L’exemple ZIP nécessite aussi de l’espace pour l’archive téléchargée dans le répertoire temporaire.
Choisir quand enregistrer l’archive
Le streaming des fichiers tar.gz et gzip économise l’espace disque du téléchargement compressé. Si vous devez comparer une somme de contrôle de l’éditeur ou vérifier une signature avant l’extraction, téléchargez d’abord le fichier dans un nouveau répertoire de travail et vérifiez-le. Qu’un extracteur accepte l’archive établit qu’il a pu la lire ; cela n’établit pas qui l’a publiée.
