← retour aux snippets

split: découper un gros fichier et recoller avec checksum

Découper un artefact en parts fixes, transférer, recoller et vérifier l'intégrité avec SHA256, en local ou via SSH.

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 avant cat.
  • Le manifest *.sha256 doit 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 --partial qui reprend proprement un transfert interrompu.
  • Évitez de supprimer les parts avant vérification de la somme. Automatisez la suppression après un sha256sum -c ré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.