wget pour télécharger intelligement le contenu d'un espace webdav

Qu'on l'aime ou qu'on ne l'aime pas, la technologie webdav est assez répandue et largement utilisée par certains hébergeurs pour partager des données. On trouve sous Linux toute un panel de logiciels capables de travailler avec webdav, et vous connaissez sans doute davfs2 qui permet de monter un partage webdav comme une partition locale.

Cependant, davfs2 fonctionne à l'aide d'un cache (sensé rendre l'usage plus fluide et confortable). Ainsi, à chaque ouverture de fichier, celui est d'abord copié en zone cache (par défaut /var/cache/davfs2/) avant d'être rendu disponible. Si ce comportement est très intéressant pour des usages classiques, il devient problématique lorsque le partage est distant et les fichiers atteignent des tailles massives (plusieurs Go) avec une grosse lenteur causée par la mise en cache !

J'ai notamment trouvé ce comportement problématique avec rsync : tentant de synchroniser avec l'excellent rsync le contenu d'un partage webdav comprenant plusieurs fichiers >10 Go (partage monté avec davfs2), je me retrouvais avec rsync bloqué, apparemment sans activité et l'impossibilité de tuer les processus. Et pour cause, davfs2 faisait tout son possible pour basculer le fichier en cache avant de laisser rsync (gelé en attente) travailler dessus... Pas idéal !

Je décidais alors de remplacer rsync par wget pour mon travail de synchronisation à sens unique :

wget -c -r -nH --cut-dirs=1 -N --user="user" --password="password" http://server.tld/webdav/
  • -c pour reprendre le téléchargement s'il a été interrompu en cours de travail
  • -r pour télécharger le répertoire de manière récursive (en suivant donc les liens au sein du partage webdav)
  • -nH et --cut-dirs=1 pour ne pas copier le nom d'hôte et le premier nom de dossier dans l'arborescence locale
  • -N pour ne télécharger depuis la source que les fichiers qui n'existent pas ou n'ont pas la même taille en local

Au passage, on "gagne" la barre de progression propre à wget dont rsync ne dispose pas par défaut.

Bien évidemment, wget n'est pas rsync et wget n'a certainement pas toutes les fonctionnalités de synchronisation avancées (et diablement intelligentes) de rsync. Cependant, il se défend admirablement pour télécharger le contenu d'un espace webdav de manière intelligente et sans bloquer sur le mécanisme de cache de davfs2 !

Mais wget, le vénérable, m'a encore bien dépanné !