← retour aux snippets

tar zstd rapide avec exclusions

Compresser et extraire avec tar+zstd, exclusions propres et préservation des droits.

objectif

Créer et extraire des archives rapides et compactes avec zstd, en excluant les fichiers inutiles et en conservant permissions et timestamps.

code minimal

# créer une archive .tar.zst du dossier ./src
tar -I 'zstd -T0 -3' -cf backup.tar.zst ./src/

# extraire dans ./restore
mkdir -p ./restore
tar -I 'zstd -d' -xf backup.tar.zst -C ./restore/

utilisation

# exclure des fichiers/dossiers courants
tar -I 'zstd -T0 -3' -cf projet.tar.zst \
  --exclude '.git' --exclude 'node_modules' --exclude '*.log' \
  ./projet/

# lister le contenu sans extraire
tar -I 'zstd -d' -tf projet.tar.zst

# créer l'archive depuis un répertoire précis pour éviter les chemins relatifs profonds
tar -C ./projet -I 'zstd -T0 -3' -cf projet.tar.zst .

# streaming via SSH (sauvegarde distante)
ssh user@serveur "tar -C /data -I 'zstd -T0 -3' -cf - projet/" > projet.tar.zst

# restauration par flux (décompression en entrée standard)
zstd -d < projet.tar.zst | tar -xf - -C ./restore/

# écriture atomique de l'archive (évite les fichiers partiels)
tmp="$(mktemp -p . .backup.tar.zst.XXXXXX)"; \
tar -I 'zstd -T0 -3' -cf "$tmp" ./src/ && mv -f "$tmp" backup.tar.zst

variante(s) utile(s)

# fallback gzip rapide avec pigz si zstd indisponible
tar -I 'pigz -9 -p 4' -cf backup.tar.gz ./src/
tar -I 'pigz -d' -xf backup.tar.gz -C ./restore/

# archive reproductible (ordre et dates fixes)
tar -I 'zstd -T0 -3' -cf backup.tar.zst \
  --sort=name --mtime='UTC 2020-01-01' --numeric-owner --owner=0 --group=0 \
  ./src/

# vérifier l'intégrité (listage puis extraction test)
tar -I 'zstd -d' -tf backup.tar.zst >/dev/null

notes

  • utilisez -I 'zstd ...' (ou --use-compress-program) pour que tar pilote zstd; -T0 active tous les threads dispo, -3 équilibre vitesse/taille.
  • préférez -C pour contrôler la racine des chemins et éviter des préfixes longs dans l’archive.
  • pour une écriture sûre, créez l’archive dans le dossier cible (même filesystem) puis faites mv -f pour un remplacement atomique.