Mise à jour d’une archive tar

update-tar

Lorsqu’une archive TAR est grosse, il peut être intéressant de la mettre à jour sans la reconstruire complétement.

:!: Mise à jour : L’option -u de tar, ajoute uniquement les nouveaux fichiers ajoutés au dossier après la création du TAR.

:!: Dans la plus part des cas la mise à jour sera plus longue que de refaire le tar

La mise à jour va ce déoulé en trois étapes :

  1. Lister les fichiers à supprimer ou à mettre à jour.
  2. Supprimer les fichiers de l’archive dans ces deux cas
  3. Ajouter tous les fichiers manquants du répertoire dans l’archive

Exemple :

Les opérations 1 et 2 peuvent être effectué simultanément :

tar -df ../file.tar . 2>&1 | sed -e 's#^tar: ##g' | cut -f1 -d":" | sed -e 's# $##g' | sort -u -r | awk '{ print "\""$0"\""}' | xargs tar --delete -f ../file.tar

L’opération 3

tar -uSpf ../file.tar .

Script :

#!/bin/bash
 
function usage () {
  echo "Usage : `basename $0` [-f|--file] FILE [-d|--directory] DIR"
  exit 1
}
 
while [ $# -gt 0 ]; do
  case $1 in
    -f|--file)
        if [ "$2" = "" ]
        then
            usage
        fi
        FILE="$2"
    shift 2
    ;;
    -d|--directory)
        if [ "$2" = "" ]
        then
            usage
        fi
        DIR="$2"
    shift 2
    ;;
    *)
    usage
    ;;
  esac
done
 
if [ ! -d "${DIR}" ]
then
    echo "${DIR} n'existe pas"
    usage
fi
 
if [ ! -f "${FILE}" ]
then
    echo "${FILE} n'existe pas"
    usage
fi
 
cd ${DIR}
 
#Suppresion des fichiers differents ou qui n'existe plus
tar -df ${FILE} . 2>&1 | sed -e 's#^tar: ##g' | cut -f1 -d":" | sed -e 's# $##g' | sort -u -r | awk '{ print "\""$0"\""}' | xargs tar --delete -f ${FILE}
 
#Ajout des fichiers qui ne sont plus dans l archive (MAJ) ou qui n y ont jamais ete (Ajout)
# Mise à jour BUG : tar -rSpf ${FILE} .
tar -uSpf ${FILE} .
 
exit 0

:error: Note, option de tar:
J’utilise les options -S et -p, car j’en avais besoin à la rédaction de ce script. Elle ne sont pas forcement nécessaire. Reporter vous à la page de MAN
:idea: Note, création d’un tar:

tar -cSpf file.tar .

:idea: Note, lister les fichiers d’un tar :

tar -tf file.tar

Comparatif :
Il s’agit de mon dossier /usr/src/ avec plusieur header de noyau. Il y en a en tous pour 260Mo.
Pour la mise à jour, j’ai déplacé un répertoire.

Création

time tar -cSpf /dev/shm/src.tar .
 
real	0m35.234s
user	0m0.520s
sys	0m3.340s

Mise à jour

time ./tar-update.sh -f /dev/shm/src.tar -d /usr/src/
 
real	0m39.669s
user	0m38.090s
sys	0m1.704s

2 commentaires

  1. Denis dit :

    Bonjour,
    dans la man page de tar il existe l’option -u qui devrait ajouter uniquement les nouveaux fichiers dans l’archive mais il semble que cette options ajoute également les fichiers non récents et non modifiés.
    Elle semble donc agir exactement comme l’option -r.
    Est-ce un bug? Avez-vous observé le même problème?

    -u, –update
    only append files that are newer than the existing in archive

    • Pierre BLONDEAU dit :

      Bonjour,

      Si je prends la page de man j’ai :
      -r, –append
      append files to the end of an archive
      -u, –update
      only append files newer than copy in archive

      Après des tests :
      -r -> ajoute les fichiers indiqués à la fin du fichier cible. Dans le cadre de mon script, ajoute deux fois les fichiers (ce n’est pas ce que je voulais faire !).
      -u -> ajoute les fichiers modifiers et les fichiers inexistants à la fin du fichier (c’est plutoôt ça que je voulais faire)

      Je pense que c’effectivement un BUG de ma part

      Merci beaucoup ;) Cordialement

Laisser un commentaire

*