Astuces :Télécharger tout un répertoire en tant que fichier zip

Gazette Linux n°155 — Octobre 2008

Adaptation française : Deny

Relecture de la version française :

Article paru dans le n°155 de la Gazette Linux d'octobre 2008.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Un rapide script CGI pour télécharger tout un répertoire en tant que fichier zip

Si vous avez une grande collection de fichiers et que vous les placez dans votre serveur web sans aucun index, il est probable que le serveur va générer ses propres index HTML pour vous. Tout cela est très bien, mais j'ai eu récemment la pénible expérience de télécharger 46 petits fichiers distincts à partir de mon serveur web, en utilisant une machine sous Windows© d'autrui avec Internet Explorer et un gestionnaire de téléchargement générant 3 fenêtres de dialogue par clic dans une langue étrangère. Ne serait-il pas merveilleux de pouvoir indiquer au serveur de tous les zipper et de m'envoyer le fichier zippé .

Vous pouvez faire ceci parce que l'utilitaire zip sous Unix (il s'agit du paquetage zip dans la plupart des distributions) est capable d'écrire dans la sortie standard. Au minimum, vous pouvez écrire un script CGI comme ceci :

#! / bin / bash 
 echo Content-Type: application/zip echo Content-Type: application / zip 
 echo "Content-Disposition: attachment; filename=files.zip" echo "Content-Disposition: attachment; filename = files.zip" 
 echo 
 zip -9r - * zip-9R - * 

Cela zippe le contenu du répertoire courant, en envoyant le résultat vers la sortie standard (C'est le rôle du tiret —) et cela indique au navigateur qu'il s'agit d'un fichier zip nommé files.zip

Mais on peut aller plus loin—le script suivant listera le contenu du répertoire, avec en option un lien « télécharger en tant que zip » qui définit le nom du fichier de manière appropriée. Si vous utilisez le petit serveur web Mathopd, vous pouvez éditer /etc/mathopd.conf et définir AutoIndexCommand vers le chemin d'accès de ce script :

 	
export Filename="$(pwd|sed -e 's,.*/,,').zip"
if test "$QUERY_STRING" == zip; then
  echo Content-type: application/zip
  echo "Content-Disposition: attachment; filename=$Filename"
  echo
  zip -9r - *
else
  echo "Content-type: text/html; charset=utf-8"
  echo
  echo "<HTML><BODY><A HREF=\"..\">Parent directory</A> |"
  echo "<A HREF=\"./?zip\">Download $Filename</A>"
  echo "<h2>Contents of $Filename</h2><UL>"
  for N in *; do
    echo "<LI><A HREF=\"$N\">$N</A> ($(du -h "$N"|cut -f1))</LI>"
  done
  echo "</UL></BODY></HTML>"
fi

 

Cela suppose que les noms de fichier qui ne sont pas en ASCII seront listés en UTF-8 (autrement, changez le jeu de caractères).

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.