PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Backup auf DVD



Xanthariel
08-10-2010, 10:38
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

John W
08-10-2010, 14:13
#!/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.

undefined
08-10-2010, 17:24
.......
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 ;)

John W
08-10-2010, 17:28
Nein, hat damit nichts zu tun, das ist ja der Witz! Das hier machte nämlich auch den von mir beschriebenen Blödsinn:


#!/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

Xanthariel
13-10-2010, 13:03
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?

John W
13-10-2010, 13:54
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.