Alte Versionen von .bak-Dateien beibehalten

609
user63274

Ich habe gerade gelernt, wie man einfache Shellskripte schreibt. Eine davon ist, dass bestimmte Dateien auf meinem System, die für mich von entscheidender Bedeutung sind, einfach dupliziert werden.

cp /dir/dir/file1 /samedir/samedir/file1.bak 

Meine Skripte werden jedes Mal ausgeführt, wenn ich mich bei meinem System anmelde. Es wird jedoch immer überschrieben file1.bak. Ich möchte einen Weg finden, alle erstellten Dateien aufzubewahren. Vielleicht so etwas wie file1(1).bak, file1(2).bakoder etwas ähnliches.

VMS war für bestimmte Dinge, nämlich, dass jedes Mal, wenn einer in eine Datei namens schreiben würde file.bak, würde es alle früheren Versionen halten, indem ein Tailing Hinzufügen ‚:‘ am Ende der Datei, dh die Versionsnummer angibt: file.bak:1, file.bak:2, file.bak:521, etc .. .

Früher wurden wir mit dem Löschbefehl los purge file.bak 1-520.

1
Du hast nichts gefunden. Wo hast du geschaut? Was ist mit [this] (http://superuser.com/q/368231/360870)? Run CMD vor 7 Jahren 0
Vielleicht möchten Sie Ihren Text als Frage umformulieren, letztendlich fragen Sie nie etwas, sondern sprechen über etwas, das Sie gerne machen möchten. nerdwaller vor 7 Jahren 0

2 Antworten auf die Frage

2
Alex

Sie können einige verwenden SCM - Software wie (auch als Versionskontrolle bekannt) git, mercurialoder fossil.

Auf diese Weise vermeiden Sie eine große Anzahl von bakDateien im Arbeitsverzeichnis und behalten gleichzeitig alle vorherigen Versionen im Auge.

Am einfachsten wäre IMHO fossil-scm. Es handelt sich um eine statisch vereinbarte Einzeldatei, die solche Jobs verarbeiten kann. (Übrigens von demselben Programmierer erstellt, der auch SQLite erstellt hat, also Qualität erwarten.)

Ihr Workflow könnte so sein:

  1. cdin das Verzeichnis, in dem Dateien verfolgt werden müssen, und das init-Repository mit dem Befehl fossil init(es wird eine einzelne Datenbankdatei vorbereitet)
  2. Sagen Sie dem Fossil ein bestimmtes Verzeichnis zu verfolgen: fossil open
  3. Fügen Sie Dateien / Verzeichnisse rekursiv zum Repository hinzu fossil addremove --dotfiles
  4. Speichern Sie den aktuellen Status des Verzeichnisses im Repository: fossil commitoder wenn Sie sich um die Integrität der Dateien kümmern, dann:fossil commit --sha1sum

Alle nachfolgenden Aufrufe von fossilist nur fossil commit(Wenn Sie weitere neue Dateien hinzufügen oder einige aus dem Tracking entfernen müssen, geben Sie einfach ein Problem vor dem Festschreiben ab. fossil addremove --dotfiles)

Auf diese Weise bleiben alle Änderungen an Dateien in der Timeline erhalten. Sie können eine Vorschau oder einen Vergleich (Diff) oder ein Extrahieren (Auschecken) aus einer Repository-Ether-Datei für Datei durchführen oder den vorherigen Zustand des gesamten Verzeichnisses vollständig wiederherstellen.

Sie können verwenden fossil extras --dotfiles, um neue nicht nachverfolgte Dateien anzuzeigen oder nur Dateien zu erkennen, die geändert wurdenfossil changes --abs-paths --sha1sum --header -v

Wenn Sie einige Dateien oder Verzeichnisse ausschließen müssen, wird dies auch von Fossil unterstützt.

Sie können die Zeitleiste der Änderungen über die nette Weboberfläche sehen, die von derselben einzigen Datei erstellt wurde, oder Sie können sogar das interne WiKi verwenden, um Änderungen an den Änderungen vorzunehmen.

Wenn Sie einige Inhalte aus dem Repository entfernen müssen, fossilbietet dies einen Mechanismus namens "Shunning".

0
stuts

Lösung

Wenn Sie kein aktuelles Versionskontrollsystem verwenden möchten (wie von @Alex & @Class Stacker vorgeschlagen), sollte das folgende Bash-Skript die Aufgabe ausführen:

#!/bin/bash  ############# # Variables # ############# FILE_LIST="foo.txt bar.doc" # Space separated list of files to backup (include full path to file) KEEP_OLD="5" # How many previous versions to keep  ############# # Functions # ############# function shift_backups { for num in $(seq $KEEP_OLD -1 1) ; do old_backup="$file.bak$num" if [[ -e $old_backup && $num == $KEEP_OLD ]] ; then echo " removing oldest file ($old_backup)" rm -f $old_backup elif [[ -e $old_backup ]] ; then new_name="$file.bak$(expr $num + 1)" echo " moving $old_backup to $new_name" mv $old_backup $new_name fi done }  ################ # Backup Files # ################ for file in $FILE_LIST ; do count=1 while [[ $count -le $KEEP_OLD ]] ; do backup_file="$file.bak$count" if [[ -e $backup_file ]] ; then echo "$backup_file exists, shifting backups" shift_backups cp $file $backup_file break else cp $file $backup_file break fi count=$(expr $count + 1) done done 

Erläuterung

Um das zu erklären, werde ich es aufschlüsseln und dir die Logik zeigen.

Variablen

  • Die FILE_LISTVariable enthält eine durch Leerzeichen getrennte Liste aller Dateien, die in die Sicherung aufgenommen werden sollen (sicherstellen, dass vollständige Dateipfade verwendet werden).
  • Die KEEP_OLDVariable gibt an, wann .bak-Dateien gelöscht werden sollen. Im Beispiel ist es auf 5 gesetzt, was bedeutet, dass Ihre Sicherungen nicht weiter als 5 Versionen zurückgehen (wobei foo.txt.bak5 die älteste Version ist).

Anmerkung: Je nachdem, für wie viele Dateien Sie dies tun, kann es sich lohnen, die Variable FILE_LIST so zu verändern, dass auf eine Datei verwiesen wird und jede Zeile darin durchlaufen wird. [Ich habe diese Idee nicht getestet]

Funktionen

Die Funktion shift_backupsführt Folgendes aus:

  • Durchläuft Sicherungsdateien vom ältesten zum neuesten

    for num in $(seq $KEEP_OLD -1 1) ; do 
  • Wenn die Sicherungsdatei vorhanden ist und der älteste Zähler ist, wird sie gelöscht

    if [[ -e $old_backup && $num == $KEEP_OLD ]] 
  • Wenn die Sicherungsdatei nur existiert, wird sie nach verschoben backup number + 1

    elif [[ -e $old_backup ]] 

Sicherungsschleife

  • Durchlaufen Sie jede Datei in der Variablen FILE_LIST

     for file in $FILE_LIST ; do 
  • Führen Sie die Sicherungsprüfungen weiter durch, während der Wert der Variablen count1 ist

    while [[ $count -le $KEEP_OLD ]] ; do 
  • Speichern Sie den Namen des Zieldateinamens in einer Variablen

    backup_file="$file.bak$count" 
  • Wenn die Sicherungsdatei vorhanden ist, wird die Funktion shift_backups aufgerufen und die Datei wird kopiert (wobei die while-Schleife unterbrochen wird).

    echo "$backup_file exists, shifting backups" shift_backups cp $file $backup_file break 
  • Wenn die Sicherungsdatei nicht vorhanden ist, wird sie nur kopiert und die while-Schleife wird beendet

    else cp $file $backup_file break 
  • Inkrementiert die Variable count

    count=$(expr $count + 1) 

Ausgabe

Das Skript enthält einige Echos, um die durchgeführten Schritte besser zu verstehen. Im Folgenden finden Sie beispielsweise die Ausgabe des Skripts, wenn es in einem Verzeichnis ausgeführt wird, in dem die neuesten Versionen der Sicherungsdateien .bak3 waren:

foo.txt.bak1 exists, shifting backups moving foo.txt.bak3 to foo.txt.bak4 moving foo.txt.bak2 to foo.txt.bak3 moving foo.txt.bak1 to foo.txt.bak2 bar.doc.bak1 exists, shifting backups moving bar.doc.bak3 to bar.doc.bak4 moving bar.doc.bak2 to bar.doc.bak3 moving bar.doc.bak1 to bar.doc.bak2 

Wenn Sie möchten, dass das Skript leise ist, entfernen Sie die Echos und es wird das gleiche ausgeführt.