Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Backup auf DVD

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.08.2009
    Beiträge
    10

    Backup auf DVD

    Hallo,
    Ich habe das Problem, dass ich Quellfiles archivieren soll.
    Diese Files sind unterscheidlich groß, von wenigen MB bis zu 1 GB kann alles dabei sein.

    Das Problem die Dateien sollen nicht getart werden (gezippt sind sie bereits).
    Und bei knapp 2.000 Dateien ist ein manuelles auf DVD brennen eine Strafe.

    Meine Idee wäre nun Pro zu brennender DVD ein Verzeichnis erstellen zu lassen und die Quellfiles in dieses zu verschieben, bis 4.5 GB beisammen sind, danach neues DVD Verzeichnis und wieder füllen bis 4.5 GB erreicht sind.

    Die Frage wäre nun wie geht man das an.
    Wie kann ich sinnvoll die Füllmenge des Unterverzeichnis errechnen?

    Für Vorschläge wie immer sehr dankbar.

    Gruß
    Xanthariel

  2. #2
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Code:
    #!/bin/bash
    cd "$1"
    
    moveFiles()
    {
        current_dir=$1
        find .tmpdir/ -type f | while read file
        do
            if du -s "$current_dir" "$file" | awk 'BEGIN {sum=0} {sum+=$1} END {if (sum > 4500000) exit(1) ; exit(0)}' > /dev/null
            then
                mv "$file" "$current_dir"
            elif du -s "$current_dir" | awk '{if ($1 > 4500000) exit(1) ; exit(0)}' > /dev/null
            then
                [[ "$(find "$current_dir" -type f | wc -l)" -eq 0 ]] && { [[ -d ignored ]] || mkdir ignored || exit 1 ; mv "$file" ignored ; }
                let current_dir++
                echo $current_dir
                mkdir "$current_dir"
            fi
        done
    }
    
    current_dir=1
    mkdir .tmpdir || { echo .tmpdir existiert bereits! ; exit 1 ; }
    find ! -name '.' ! -name '.tmpdir' -exec mv {} .tmpdir/ \;
    mkdir "$current_dir"
    until [ "$(find .tmpdir/ -type f | wc -l)" -eq 0 ]
    do
        current_dir=$(moveFiles $current_dir | tail -n1)
    done
    In einem Verzeichnis außerhalb der zu brennenden Daten abspeichern und mit "bash <Skript> <Pfad-zu-Dateien>" abspeichern, in den durchnummerierten Ordnern sind dann die Dateien in Bündeln a 4,5 GB.
    Dateien, die selbst schon mehr als 4,5 GB haben, werden in den Ordner ignored verschoben.

    BTW: Kann mir mal jemand erklären, warum current_dir immer zurückgesetzt wird, wenn man die Schleife in moveFiles verlassen hat (direkt nach do)? Ich hab beim Testen da ordentlich Probleme mit gekriegt.

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von John W Beitrag anzeigen
    .......
    BTW: Kann mir mal jemand erklären, warum current_dir immer zurückgesetzt wird, wenn man die Schleife in moveFiles verlassen hat (direkt nach do)? Ich hab beim Testen da ordentlich Probleme mit gekriegt.
    Oder anders gefragt - Was ist Innerhalb einer Shell Funktion global und was nicht
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Nein, hat damit nichts zu tun, das ist ja der Witz! Das hier machte nämlich auch den von mir beschriebenen Blödsinn:
    Code:
    #!/bin/bash
    cd "$1"
    
    current_dir=1
    mkdir .tmpdir || { echo .tmpdir existiert bereits! ; exit 1 ; }
    find ! -name '.' ! -name '.tmpdir' -exec mv {} .tmpdir/ \;
    mkdir "$current_dir"
    until [ "$(find .tmpdir/ -type f | wc -l)" -eq 0 ]
    do
        find .tmpdir/ -type f | while read file
        do
            if du -s "$current_dir" "$file" | awk 'BEGIN {sum=0} {sum+=$1} END {if (sum > 4500000) exit(1) ; exit(0)}' > /dev/null
            then
                mv "$file" "$current_dir"
            elif du -s "$current_dir" | awk '{if ($1 > 4500000) exit(1) ; exit(0)}' > /dev/null
            then
                [[ "$(find "$current_dir" -type f | wc -l)" -eq 0 ]] && { [[ -d ignored ]] || mkdir ignored || exit 1 ; mv "$file" ignored ; }
                let current_dir++
                echo $current_dir
                mkdir "$current_dir"
            fi
        done
    done

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.08.2009
    Beiträge
    10
    Vielen Dank für die Hilfe :-)

    Habe das Skript ausprobiert und bekomme diesen Fehler:

    :/export/home/t354884=> ./dvd_backup.sh /app/GB4/dyn/vdps/queues/tk/Feed/Done
    find: [-H | -L] path-list predicate-list
    mkdir: Failed to make directory "1"; File exists

    im Ordner /app/GB4/dyn/vdps/queues/tk/Feed/Done wurde ein .tmpdir angelegt dun ein 1 beide Ordner sind leer.

    Liegt das an Solaris?

  6. #6
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    find scheint die Parameter etwas anders zu erwarten, da müsstest du dran rumbasteln - find soll alle Dateien als Liste mit relativem oder absolutem Pfad angeben, Verzeichnisse sollen nicht ausgegeben werden.
    Stell sicher, dass du das Skript aus meinem ersten Beitrag nimmst, da tritt der Fehler mit mkdir nicht auf.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •