1 votes

Sauvegarde de nombreux fichiers en conservant toutes les anciennes versions

Ma question porte sur la sauvegarde de plusieurs fichiers de plusieurs répertoires dans un seul répertoire en conservant toutes les anciennes versions des fichiers. J'ai environ 10 répertoires contenant des fichiers très similaires (10 répertoires de sauvegarde créés sous Linux, Windows et MacOS). Je veux concaténer ces 10 répertoires en un seul. Par exemple, j'ai 3 répertoires a, b et c avec le contenu suivant :

  • a

    • fileA.txt (date 10/10/2012)
    • fileB.txt (date 10/12/2012)
    • fileC.txt (date 01/05/2013)
  • b

    • fileA.txt (date 10/01/2013)
    • fileB.txt (date 10/02/2013)
    • fileC.txt (date 01/05/2013)
    • fileD.txt (date 02/05/2013)
  • c

    • fileA.txt (date 10/10/2012)
    • fileB.txt (date 12/02/2013)

Le répertoire résultant doit être :

  • fileA.txt (date 10/01/2013 de b)
  • fileA.txt_20121010hhmmss (de a et c (même fichier))
  • fileB.txt (date 12/02/2013 de c)
  • fileB.txt_20121210hhmmss (de a)
  • fileB.txt_20130210hhmmss (de b)
  • fileC.txt (date 01/05/2013 de a et b (même fichier))
  • fileD.txt (date 02/05/2013 de b)

hh=heures mm=minutes ss=secondes

Actuellement, je travaille sur un script Perl qui peut comparer les fichiers en utilisant la fonction "compare" et une somme de contrôle md5.

Pour trouver la date de modification (si les fichiers sont différents), j'utilise les métadonnées (quand je peux) en utilisant Exiftool (quelques fichiers compatibles comme docx, ppt pdf jpg...) sinon j'utilise l'horodatage en utilisant la commande stat.

Le fichier sans l'extension ajoutée doit être le plus récent de tous les fichiers portant le même nom.

Le script de Perl est très lent et complexe, c'est pourquoi je cherche une solution plus robuste.

Merci pour votre aide.

NB : - Je souhaite utiliser cette solution sur un serveur Synology (DS212) sur lequel je n'ai que très peu de commandes classiques Shell. Si nécessaire, je peux copier ces fichiers sur une machine linux (ou OSX) pour faire cela.

1voto

dafnahaktana Points 111

Solution :

cat backup.sh
#!/bin/sh
for i in `find ./{a,b,c} -type f`
do
  FILE=`basename $i`
  FTIME=`stat -c %x $i | awk -F"." '{print $1}' | sed 's/[-: ]//g'`
  NEWNAME=${FILE}_${FTIME}
  echo "cp $i result/${NEWNAME}"
  cp -p $i result/${NEWNAME}
done
cd result
for i in `ls -1 | awk -F"_" '{print $1}' | sort -u`
do
  TNAME=`ls -1t ${i}* | head -1`
  echo "mv ${TNAME} ${i}"
  mv ${TNAME} ${i}
done

Sauvegarde des fichiers dans le répertoire "résultat".

Comment cela fonctionne (exemple) :

$ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0

~/tmp/backup $ ./backup.sh 
cp ./a/fileA.txt result/fileA.txt_20130606162832
cp ./a/fileB.txt result/fileB.txt_20130606162836
cp ./a/fileC.txt result/fileC.txt_20130606162846
cp ./b/fileA.txt result/fileA.txt_20130606162857
cp ./b/fileD.txt result/fileD.txt_20130606162910
cp ./b/fileB.txt result/fileB.txt_20130606162900
cp ./b/fileC.txt result/fileC.txt_20130606162906
cp ./c/fileA.txt result/fileA.txt_20130606162920
cp ./c/fileB.txt result/fileB.txt_20130606162923
mv fileA.txt_20130606162920 fileA.txt
mv fileB.txt_20130606162923 fileB.txt
mv fileC.txt_20130606162906 fileC.txt
mv fileD.txt_20130606162910 fileD.txt

~/tmp/backup $ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162832
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162857
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt_20130606162836
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt_20130606162900
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt_20130606162846
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

~/tmp/backup $

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X