Sichern Sie viele Dateien, indem Sie alle alten Versionen behalten

1

Meine Frage ist es, viele Dateien aus vielen Verzeichnissen in nur einem Verzeichnis zu speichern, indem alle alten Versionen der Dateien beibehalten werden. Ich habe ungefähr 10 Verzeichnisse mit sehr ähnlichen Dateien (10 Sicherungsverzeichnisse, die unter Linux, Windows und MacOS erstellt wurden). Ich möchte diese 10 Verzeichnisse in nur einem verketten. Zum Beispiel habe ich 3 Verzeichnisse a, b und c mit folgendem Inhalt:

  • ein

    • fileA.txt (Datum 10.10.2012)
    • fileB.txt (Datum 12.10.2012)
    • fileC.txt (Datum 05.01.2013)
  • b

    • fileA.txt (Datum 01.10.2013)
    • fileB.txt (Datum 02.10.2013)
    • fileC.txt (Datum 05.01.2013)
    • fileD.txt (Datum 05.02.2013)
  • c

    • fileA.txt (Datum 10.10.2012)
    • fileB.txt (Datum 02.12.2013)

Das resultierende Verzeichnis muss sein:

  • fileA.txt (Datum 01.10.2013 von b)
  • fileA.txt_20121010hhmmss (von a und c (gleiche Datei))
  • fileB.txt (Datum 12/02/2013 von c)
  • fileB.txt_20121210hhmmss (von a)
  • fileB.txt_20130210hhmmss (von b)
  • fileC.txt (Datum 05.01.2013 von a und b (gleiche Datei))
  • fileD.txt (Datum 05.02.2013 von b)

hh = Stunden mm = Minuten ss = Sekunden

Derzeit arbeite ich an einem Perl-Skript, das die Dateien mit der Funktion "compare" und einer MD5-Prüfsumme vergleichen kann.

Um das Änderungsdatum zu finden (wenn die Dateien unterschiedlich sind), verwende ich die Metadaten (wenn ich kann) mit Exiftool (nur wenige kompatible Dateien wie docx, ppt pdf jpg ...), andernfalls verwende ich den Zeitstempel mit dem Befehl stat .

Die Datei ohne die hinzugefügte Erweiterung muss die aktuellste aller Dateien mit demselben Namen sein.

Das Perl-Skript ist sehr langsam und komplex, daher suche ich nach einer stabileren Lösung.

Danke für deine Hilfe.

NB: - Ich möchte diese Lösung auf einem Synology Server (DS212) verwenden, auf dem ich nur wirklich wenige klassische Shell-Befehle habe. Bei Bedarf kann ich diese Dateien auf einen Linux- (oder OSX-) Computer kopieren, um dies zu tun.

Guuk
quelle
Sie können Diffs anstelle von vollständigen Dateien behalten (funktioniert am besten auf TXT-Dateien)
Ratschen-Freak
Haben Sie stattdessen ein Versionskontrollsystem wie Git, Subversion oder Mercurial in Betracht gezogen?
Chepner
@ratchetfreak die Verzeichnisse enthalten Bilder, Filme, Binärdateien, Microsoft Office-Dateien ... Derzeit ist der Speicherplatz kein Problem.
Guuk
@chepner das problem ist, dass ich die neueren dateien nicht kenne. Im Versionskontrollsystem fügen Sie die Dateien nacheinander und nacheinander hinzu (Sie arbeiten an den Verzeichnissen). Jede neue Änderung wird wie eine neue Version behandelt (glaube ich). Ein weiteres Problem ist, dass die Verzeichnisse ungefähr ein GB vieler Arten von Dateien (und Binärdateien) enthalten.
Guuk
Möglicherweise besteht eine Idee darin, den Befehl rsync zu verwenden. Wenn Sie die Option -u verwenden, können Sie sogar vermeiden, die Dateien im Ziel zu löschen, aber rsync fügt am Ende nur ein ~ hinzu. Außerdem weiß ich nicht, ob rsync den Zeitstempel der Datei (und genauer das Änderungsdatum) für die Speicherung der aktuelleren Datei berücksichtigen kann.
Guuk,

Antworten:

1

Lösung:

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

Sicherungsdateien im Verzeichnis "result".

Wie es funktioniert (Beispiel):

$ 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 $
September
quelle
Vielen Dank für Ihre Antwort. Mit welcher Technik kann ich Ihrer Meinung nach überprüfen, ob die duplizierten Dateien vorhanden sind?
Guuk
Das hängt von Ihrem Backup-System ab. Es kann viele Nuancen geben. Als Beispiel können Sie die MD5-Summe auf Duplikate überprüfen oder "diff" verwenden.
September