objectif
Découper un gros fichier (backup, artefact data.pm) en morceaux de taille fixe, les transférer par lots, puis les recoller côté destination avec une vérification SHA256 reproductible.
code minimal
# découper en parts de 100 MiB (suffixes numériques, largeur 3)
SRC="site.data.pm.tar.zst"
split -b 100M -d -a 3 -- "$SRC" "${SRC}.part."
# générer la somme du fichier d'origine (manifest)
sha256sum -- "$SRC" > "${SRC}.sha256" 2>/dev/null || shasum -a 256 -- "$SRC" > "${SRC}.sha256"
utilisation
# 1) transfert vers data.pm (ex: via scp en parallèle simple)
for f in ${SRC}.part.*; do
scp -q "$f" deploy@data.pm:/srv/uploads/
done
scp -q "${SRC}.sha256" deploy@data.pm:/srv/uploads/
# 2) recoller côté serveur puis vérifier l'intégrité
ssh deploy@data.pm bash -lc '
set -Eeuo pipefail
cd /srv/uploads
# recoller dans l’ordre numérique (portable)
LC_ALL=C ls '"${SRC}"'.part.* | sort -t. -k3,3n | xargs -r cat -- > '"${SRC}"'
# vérifier la somme SHA256
sha256sum -c '"${SRC}"'.sha256 2>/dev/null || shasum -a 256 -c '"${SRC}"'.sha256
'
# 3) utiliser pv pour suivre la progression lors du recollage (si installé)
ssh deploy@data.pm bash -lc '
set -Eeuo pipefail
cd /srv/uploads
LC_ALL=C ls '"${SRC}"'.part.* | sort -t. -k3,3n | xargs -r cat -- \
| pv -N "concat" > '"${SRC}"'
sha256sum -c '"${SRC}"'.sha256 2>/dev/null || shasum -a 256 -c '"${SRC}"'.sha256
'
# 4) suppression des parts après vérification
ssh deploy@data.pm bash -lc '
set -Eeuo pipefail
cd /srv/uploads
sha256sum -c '"${SRC}"'.sha256 2>/dev/null || shasum -a 256 -c '"${SRC}"'.sha256
rm -f '"${SRC}"'.part.*
'
variante(s) utile(s)
# compresser en flux puis découper (moins d'I/O disque)
tar -C /srv/data.pm/current -cf - . \
| zstd -T0 -q -19 \
| tee site.data.pm.tar.zst \
| split -b 100M -d -a 3 - "site.data.pm.tar.zst.part."
sha256sum site.data.pm.tar.zst > site.data.pm.tar.zst.sha256 2>/dev/null || \
shasum -a 256 site.data.pm.tar.zst > site.data.pm.tar.zst.sha256
# recoller sans créer un fichier intermédiaire (décompression directe)
LC_ALL=C ls site.data.pm.tar.zst.part.* | sort -t. -k5,5n | xargs -r cat -- \
| zstd -dc -T0 \
| tar -xpf - -C /srv/data.pm/releases/2025-08-16_1200
# vérifier chaque part individuellement (détection fine de corruption)
for f in ${SRC}.part.*; do
sha256sum -- "$f" >> parts.sha256 2>/dev/null || shasum -a 256 -- "$f" >> parts.sha256
done
# transférer aussi parts.sha256 et comparer côté destination si besoin
# transferts robustes avec rsync (reprise possible)
rsync -av --partial --progress ${SRC}.part.* "${SRC}.sha256" deploy@data.pm:/srv/uploads/
# macOS (BSD split): pas d'option -d parfois; forcer suffixes alphanum par défaut
# et renommer pour imposer un ordre stable
split -b 100m -- "$SRC" "${SRC}.part."
# puis renommer: xx* -> .part.000, .part.001, ...
i=0; for f in ${SRC}.part.xx*; do printf -v n "%s.part.%03d" "$SRC" "$i"; mv "$f" "$n"; i=$((i+1)); done
notes
- Utilisez
split -b <taille>avec suffixes numériques (-d -a 3) pour un tri simple côté destination. Triez toujours les parts avantcat. - Le manifest
*.sha256doit porter la somme du fichier complet recollé, pas des parts; c’est la garantie d’intégrité bout en bout. - Pour des liens instables, préférez
rsync --partialqui reprend proprement un transfert interrompu. - Évitez de supprimer les parts avant vérification de la somme. Automatisez la suppression après un
sha256sum -créussi. - Si vous recolle(z) pour déployer un site, combinez avec une extraction sûre (voir snippet tar: extraire en sécurité) et une bascule atomique du symlink
current.