objectif
Visualiser la progression et le débit des transferts et compressions en ligne de commande (tar, curl, zstd), limiter la bande passante et produire des logs exploitables.
code minimal
# compresser un dossier avec barre de progression (taille connue via du -sb)
SIZE="$(du -sb ./build/data.pm | awk '{print $1}')"
tar -C ./build/data.pm -cf - . \
| pv -s "$SIZE" \
| zstd -T0 -q -19 > site.data.pm.tar.zst
utilisation
# 1) télécharger un artefact depuis cdn.data.pm avec ETA (Content-Length)
URL="https://cdn.data.pm/releases/data.pm/site.tar.zst"
SIZE="$(curl -fsSI "$URL" | awk 'tolower($1)=="content-length:"{print $2}' | tr -d '\r')"
curl -fsS "$URL" \
| pv -s "${SIZE:-0}" -N "download" \
| tee site.tar.zst >/dev/null
# 2) transfert SSH avec contrôle de débit (10 MiB/s) et progression
ssh deploy@data.pm 'tar -C /srv/data.pm/current -cf - .' \
| pv -L 10m -N "ssh->local" \
| zstd -T0 -q -19 > data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst
# 3) décompression en flux avec indicateur lisible
pv -N "unpack" site.tar.zst \
| zstd -dc -T0 \
| tar -xpf - -C /srv/data.pm/releases/2025-08-15_1200
# 4) copier un gros fichier local avec barre + vitesse moyenne
pv -tpreb /srv/data/bigfile.bin > /srv/data/bigfile.copy.bin
# -t: timer, -p: pourcentage, -r: débit, -e: ETA, -b: bytes
# 5) pipeline multiple avec labels distincts (debug complet)
tar -C /srv/api.data.pm/data -cf - . \
| pv -N "tar" \
| zstd -T0 -q -19 \
| pv -N "zstd" \
> api.data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst
# 6) logging JSONL du débit (parseable)
( curl -fsS "$URL" | pv -f -r -B 1048576 > /dev/null ) 2>&1 \
| awk -v ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)" '
/[0-9]+(\.[0-9]+)? [kMG]?B\/s/{
gsub(/,/,""); print "{\"ts\":\"" ts "\",\"line\":\"" $0 "\"}"
}'
variante(s) utile(s)
# limiter le débit pour ne pas saturer la prod (4 MiB/s)
pv -L 4m backup.dump.zst > /dev/null
# estimer SIZE de façon portable si du -sb indisponible (macOS)
SIZE="$(tar -C ./build/data.pm -cf - . | wc -c | tr -d ' ')"
tar -C ./build/data.pm -cf - . \
| pv -s "$SIZE" \
| zstd -T0 -q -19 > site.data.pm.tar.zst
# afficher une progression même sans taille connue (compteur d'octets)
tar -C /srv/data.pm/current -cf - . \
| pv -N "bytes" \
| cat > /dev/null
# pipeline réseau bout en bout: staging -> bastion -> local avec ETA
ssh -J bastion.data.pm deploy@staging.data.pm 'tar -C /srv/data.pm/current -cf - .' \
| pv -L 8m -N "staging->local" \
| zstd -T0 -q -19 > staging_data.pm_$(date -u +%Y%m%dT%H%M%SZ).tar.zst
# mesurer le temps total et le débit effectif (wrap simple)
ts() { date -u +%s; }
start="$(ts)"
dd if=/dev/zero bs=1M count=1024 2>/dev/null | pv -N "copy" > /dev/null
dur=$(( $(ts) - start ))
echo "duration_s=$dur"
notes
-s <bytes>permet àpvde calculer le pourcentage et l’ETA. Donnez une taille fiable (Content-Length,du -sb,wc -c).-Llimite le débit (suffixes:k,m,g). Idéal pour préserver la bande passante en production.- utilisez
-Npour nommer chaque étape de pipeline; combinez plusieurspvpour séparer les phases (tar, zstd, upload). pv -tprebaffiche timer, pourcentage, débit, ETA et bytes transférés;-fforce l’affichage même hors TTY.- installation: Debian/Ubuntu
sudo apt install pv, macOSbrew install pv.