Linux – Bash – Mettre à jour les temps entre deux sauvegardes

J’ai récemment dû réinstaller tout ce que j’avais sur mon serveur maison et l’une des applications est de faire une sauvegarde de mes données importantes à un entrepôt crypté sur Amazon. Le problème ici est qu’en recopiant tous mes fichiers sur mon serveur, les dates sont d’aujourd’hui, alors que sur Amazon, elles sont toutes dans le passé. Cela signifie qu’à la prochaine exécution de ma sauvegarde, tous mes 20G de données vont être recopiés sur Amazon. Yeark!

Pour éviter cela, j’ai pensé faire un script qui regarde mes nouvelles dates sur mon serveur et si les fichiers sur Amazon ont une autre date, elles seront mises à jour. Ainsi, seulement les fichiers avec des tailles différentes seront copiés puisqu’ils seront vraiment nouveaux.

Voici le script, suivi de quelques explications:

#!/bin/bash

set -e

# Check params
if [ $# -ne 2 ]; then
    echo Usage: $0 SOURCE_DIR DEST_DIR;    
    exit
fi

# Get the params
DIR_SRC=$1
DIR_DST=$2

cd $DIR_SRC
find . -type f -print0 | while read -d $'\0' file
do
  # Check the destination file exists
  SRC_FILE=$DIR_SRC/$file
  DST_FILE=$DIR_DST/$file
  if [ -f "$DST_FILE" ]; then
  
    # Check the modification time are different
    SRC_MOD_TIME=$(stat -c '%Y' "$SRC_FILE")
    DST_MOD_TIME=$(stat -c '%Y' "$DST_FILE")

    if [ "$SRC_MOD_TIME" -ne "$DST_MOD_TIME" ]; then
    
      # Update destination modification time
      TOUCH_MOD_TIME=$(date -d @${SRC_MOD_TIME} +'%Y-%m-%d %H:%M:%S')
      touch -d "${TOUCH_MOD_TIME}" "$DST_FILE"
      echo Updated to "${TOUCH_MOD_TIME}" the file "$DST_FILE"
      
    fi
    
  fi

done

L’utilisation est simple. Si vous le nommez « script.sh », vous pouvez appeler
script.sh /tmp/ma/source /tmp/ma/destination

Premièrement, s’il y a des fichiers avec des espaces, ce n’est pas un problème puisqu’à la ligne 16, on dit de terminer les noms de fichiers par un caractère nul et ensuite de lire chaque paramètre qui termine avec un caractère nul.

Ensuite, les dates sont regardées avec l’application « stat » (aux lignes 24 et 25) et elles sont retournées en nombre de secondes selon l’Epoch (d’où le %Y).

Puis, la date est transformée au format « 2013-11-12 20:38:01 » à la ligne 30 en utilisant l’application « date ».

Pour terminer, un « touch » est fait sur le fichier de destination à la ligne 31.