Am Mittwoch, 24. September 2003 00:44 schrieb Daniel Lord:
anbei ein Skript das ein Übergrosses Verzeichniss mit X Unterverzeichnissen auf möglichst wenige CD's brennt. Vielleicht kann das ja ausser mir noch jemand gebrauchen.
An die Skriptgurus vielleicht die Bitte wenn euch was auffällt das besser/anderst/zusätzlich oder sonst wie gemacht werden sollte bitte bescheid sagen.
David, das galt Dir ;)
Der bin ich zwar nicht, aber trotzdem einige Anmerkungen.
#!/bin/bash # Skript um ein Verzeichnis >> 700MB mit vielen Unterverzeichnissen # < 700MB # auf CD's zu schreiben. CD's sind 1 zu 1 lesbar und enthalten # Listen mit dem Inhalt der anderen CD's # VERZEICHNIS="/mnt/server/software" # zu sicherndes Verzeichnis ISO9660="/mnt/backup/backup.iso" # 700MB müssen frei sein PATHLIST="/tmp/cdrom" # X.txt wird angehängt LOG="/dev/null" # /dev/null für kein Log CDSIZE="700000000" # in Byte CDRW="yes" # werden CD-RW verwendet? # # Programme definieren: (wird noch statisch) # MKISOFS=`which mkisofs` MKI_OPT=" -nobak -l -o $ISO9660 --path-list " CDRECORD=`which cdrecord` CDR_OPT=" -v -eject dev=0,0,0 speed=4 " # ######## AB HIER SOLLTEN KEINE ÄNDERUNGEN MEHR NÖTIG SEIN ####### # # Hier wird aufgeräumt function cleanup () { rm -f "$ISO9660"
for each in 0 1 2 3 4 5 6 7 8 9 do rm -f "$PATHLIST".$each.txt done }
Was passiert, wenn mehr als 10 Listen vorhanden sind? Solltest du hier nicht besser alle zutreffenden Listen loeschen (du arbeitest ja unten immer mit >>)? Der cleanup lässt sich imho besser direkt in die Schleife unten einbauen (ich habe die Stellen mit # cleanup gekennzeichnet).
# # Script soll als root ausgeführt werden # if [ $USER != root ] then echo "Programm muss als Benutzer \"root\" ausgeführt werden." exit -1; fi
Das ist a) falsch und b) unsicher und lässt sich c) leicht austricksen: <schnipp> jan@roland:~> echo $USER jan jan@roland:~> export USER=root jan@roland:~> if test "$USER" = "root"; then
echo "hurra, ich bin root" fi hurra, ich bin root <schnapp> Besser wäre es hier, das Kommando "id -u" zu benutzen (die Rechte hängen eh an der User-ID, nicht am Namen) und if test `id -u` -ne 0; then ... fi aufzurufen.
# # Sicherheitsvorkehrungen # cleanup # # Liste mit Pfaden erstellen und prüfen, dass 700MB nicht # überschritten # werden. # SIZE=0 num=1
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
# cd "$VERZEICHNIS" for dir in *
Fehler bei Pfaden mit Leerzeichen, besser: ls | while read dir; do
do let SIZE=$[SIZE+`du -sb "$dir" | cut -f 1`] if test $SIZE -lt $CDSIZE then if test 0 -lt $SIZE then echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt else SIZE=0
huch? $SIZE müsste hier doch eh 0 sein nach Deiner if-Abfrage oben. Ich kenne keinen Fall, in dem du einen negativen Wert zurückliefert. IMHO ist dieser if-then-else überflüssig.
let num=$[num+1] echo "Überlauf --> nächste CD"
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt fi else SIZE=0 echo "CD $num voll --> nächste CD" let num=$[num+1]
#cleanup (der > gehört zum Kommando und ist kein Quoting)
"$PATHLIST".$num.txt
echo "$VERZEICHNIS/$dir" >> "$PATHLIST".$num.txt
Was machst Du bei einer 701 MB großen Datei / Verzeichnis? Sowas solltest Du zusätzlich abfangen und die Datei mit einer Fehlermeldung verwerfen.
fi done # # IMAGES der Reihe nach erstellen und auf CD brennen. # cd "$VERZEICHNIS" # Nur für den Fall .... i=1; for each in $PATHLIST.?.txt
Fehler bei Pfaden mit Leerzeichen, besser: ls $PATHLIST.?.txt | while read each; do Du begrenzt oben die Anzahl der zu erstellenden Textdateien nicht, hier fragst Du nur 0 - 9 (und evtl. zufälligerweise rumliegende a-z, A-Z,...) ab.
do echo -en "ISO Image wird erstellt." if $MKISOFS $MKI_OPT $each $PATHLIST.?.txt > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi if test $CDRW = "yes" then echo -en "CD-RW wird gelöscht" if $CDRECORD $CDR_OPT blank=fast > $LOG 2>&1 then echo " OK" else echo " Failed" cleanup exit -1 fi else echo "Die CD wird nicht gelöscht da CDRW != yes" fi echo -en "CD wird gebrannt " if $CDRECORD $CDR_OPT -data $ISO9660 > $LOG 2>&1 then echo " OK" echo "CD $i bitte wechseln und RETURN drücken" let i=$[i+1] read JUNK else echo " Failed" echo "Der Brennvorgang war nicht erfolgreich" echo "Das Programm wird beendet" cleanup exit -1 fi done # # Aufräumen # cleanup # EOF
Jan