Linux 15.068 Themen, 107.492 Beiträge

Script-Routine: for-Schleife: wie denn oder wie sonst?

edico / 10 Antworten / Baumansicht Nickles

Hej folks,

Problembereich "Script-Routine": Eine gepackte Datei wird gesplittet und soll via Disketten verschoben werden. Der gepackte tar wird Disk-gemäss gesplittet nach file.tgz.001, file.tgz.002 ...

So läufts nach dem Packen und Splitten mit 2 Disks:
mount /floppy
mv *.001 /floppy
umount /floppy
echo Disk wechseln ... [Ret]
read
mount /floppy
mv *.002 /floppy
umount /floppy
echo Done ... [Ret]
read

Wie heisst die Schleife, um floppy zu mounten, file.tgz.001 zu verschieben, zu unmounten .. und die Schleife beginnt von vorne. Notwendig, wenn nicht klar ist,
wieviele Disks nötig: also nicht nur 2, sondern 3 oder 4.

Ich hatte folgenden Versuch gestartet:
for i in file.tgz.*i; do
mount /dev/fd0;
mv *.0* /floppy;
umount /dev/fd0;
echo Diskette wechseln ... [ENTER]
read
done

Ha, sagt der Fachmann - so läuft das natürlich nicht.
Ja, das hab ich auch gemerkt. Der Script schiebt den 1. gesplitteten file auf die Disk - aber nur zum Teil, und statt nun auf echo und read zu warten, schiebt er den anderen gesplitteten files auch nur zum Teil auf die Disk und kommt dann erst zu read ... und schliesst zu guter letzt den Script ab!
Wo ist der Fehler in meiner Schleife?

Danke. edico

bei Antwort benachrichtigen
Klaus_T edico „Script-Routine: for-Schleife: wie denn oder wie sonst?“
Optionen

for i in file.tgz.001 file.tgz.002 file.tgz.003; do
mount /dev/fd0;
mv $i /floppy;
umount /dev/fd0;
echo "Diskette wechseln"
read
done

Ungetestet

Bye, Klaus

bei Antwort benachrichtigen
edico Klaus_T „for i in file.tgz.001 file.tgz.002 file.tgz.003 do mount /dev/fd0 mv i /floppy...“
Optionen

Hallo Klaus,
dein Vorschlag getestet:
edico@linux:~ > x2nt4
x/Data:Projekte
tar: Removing leading `/' from member names
Splitting file.tgz into 2 pieces.
file.tgz.001 1433600 bytes
file.tgz.002 553083 bytes
mv: /floppy/file.tgz.002: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
Diskette wechseln ... [RET]
mv: /floppy/file.tgz.002: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
Diskette wechseln ... [RET]
mv: /floppy/file.tgz.002: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
Diskette wechseln ... [RET]
... done.
packt mir auf die Diskette1 den 001-file vollständig und (!) 23K von 553K des 2.files, letzteres soll er nicht! Er öffnet nicht das Floppy erneut, weil er wohl der Ansicht ist, dass er auch den 002-file verschoben hat; soll er auch nicht!
Zum anderen: was ist denn bei dem Befehl, wenn mein tarball so gross ist, dass es vier splittings werden und beim nächsten Mal zwei, dann drei ...??
Mir scheint, dass die for-Schleife nicht für Scripte dieser Art geeignet ist; aber was wäre die Problemlösung? Ich weiss, Du bist um eine Antwort nie verlegen.
Danke. edico

bei Antwort benachrichtigen
edico Klaus_T „for i in file.tgz.001 file.tgz.002 file.tgz.003 do mount /dev/fd0 mv i /floppy...“
Optionen

Hej Klaus,
es war wohl schon zu spät, dass ich die mv-Zeile nicht registriert hatte! Sorry. Ist aber ja auch logisch! Ergebnis insofern schon etwas besser:
edico@linux:~ > x2nt4
x/Data:Projekte
tar: Removing leading `/' from member names
Splitting file.tgz into 2 pieces.
file.tgz.001 1433600 bytes
file.tgz.002 553083 bytes
mv: /floppy/file.tgz.002: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
Diskette wechseln ... [RET]
Diskette wechseln ... [RET]
mv: *.00*: Datei oder Verzeichnis nicht gefunden
Diskette wechseln ... [RET]
... done.
Auf die Disk1 packt er 001-splitting komplett und 002-splitting 23,50K , die restlichen 540,12K packt er dann auf die Disk2. Zusammenfügen werde ich die wohl nicht können. Habs noch nicht versucht, kann ich mir aber gar nicht vorstellen!
Der bei der vorherigen Antwort zuletzt genannte Punkt bleibt unberührt: Wenn ich vorher nicht weiss, wie gross der tarball wird und damit wieviele splittings: was dann?
Danke. edico

bei Antwort benachrichtigen
Klaus_T edico „Hej Klaus, es war wohl schon zu spät, dass ich die mv-Zeile nicht registriert...“
Optionen

Also, ich habe gerade das hier ausprobiert:

#!/bin/sh

for i in file.tgz.001 file.tgz.002 file.tgz.003; do
mount /dev/fd0
mv $i /floppy
umount /dev/fd0
echo "Diskette wechseln"
read
done

Das klappt einwandfrei. Das Problem ist jetzt noch, wieviele Dateien es sind. Das rauszufinden wird wohl ein bischen kniffelig. Ich arbeite daran.

Klaus

bei Antwort benachrichtigen
Klaus_T Nachtrag zu: „Also, ich habe gerade das hier ausprobiert: !/bin/sh for i in file.tgz.001...“
Optionen

So, ich habe es jetzt:

#!/bin/sh
a=`find -name 'file.tgz.*'`

for i in $a; do
mount -t vfat /dev/fd0 /floppy
mv $i /floppy
umount /floppy
echo "Diskette wechseln"
read
done

Bye, Klaus

bei Antwort benachrichtigen
edico Klaus_T „So, ich habe es jetzt: !/bin/sh a find -name file.tgz. for i in a do mount -t...“
Optionen

Hej Klaus,
die Variable a hats wohl gemacht, in die find alles einliest. Richtig?
Dein Mount-Befehl (der -adaptiert aufs cdrom- hatte mich schon mal zur Weissglut getrieben und -ich glaube- daher rührte der ursächliche verquere mount-command) führt zur Meldung:
mount: Die Befehlsausführung ist nur 'root' gestattet. Das führt dann dazu:
mv: kann reguläre Datei »/floppy/file.tgz.001« nicht anlegen: Keine Berechtigung
umount: /floppy ist laut 'mtab' nicht gemountet.
Bei mir (SuSE 7.0) läufts anscheinend nur mit mount /floppy (/cdrom). Diese Abänderung in Deinem Script führt zum Ergebnis!
#!/bin/sh
#Shellskript DataX2NT4
cd ~/tmp
tar czf file.tgz -X /home/edico/sup/x2nt4.notar /home/edico/daten/*
lxsplit -s file.tgz 1400k
rm file.tgz
a=`find -name 'file.tgz.*'`
for i in $a; do
echo Move $i
mount /floppy
mv $i /floppy
umount /floppy
echo Diskette wechseln
read
done
Juuhuu - Tusen tak. edico

bei Antwort benachrichtigen
Klaus_T edico „Hej Klaus, die Variable a hats wohl gemacht, in die find alles einliest....“
Optionen

Klar, schau in deiner /etc/fstab nach. Mein mount Befehl ist vollstaendig und den darf nur root machen, da in der fstab als user ein anderer Befehl drinsteht.
Wenn du nur mount /floppy eingibst, nimmt er den mountbefehl aus der fstab und das darfst du dann als User machen.

Klaus

bei Antwort benachrichtigen
edico Klaus_T „Klar, schau in deiner /etc/fstab nach. Mein mount Befehl ist vollstaendig und...“
Optionen

Guten Abend Klaus,
gut, ok.
/dev/cdrom /cdrom auto ro,noauto,user,exec 0 0
/dev/fd0 /floppy auto noauto,user 0 0
Aber dann ist doch mit dem Script das soweit jetzt i.O., nicht wahr!
Hab viel gelernt aus diesem "Disput".
Dank Dir nochmal sehr. edico

bei Antwort benachrichtigen
Klaus_T edico „Guten Abend Klaus, gut, ok. /dev/cdrom /cdrom auto ro,noauto,user,exec 0 0...“
Optionen

>/dev/cdrom /cdrom auto ro,noauto,user,exec 0 0
>/dev/fd0 /floppy auto noauto,user 0 0

Das user am Ende sagt dir, das du als user dieses Geraet mounten darfst, wenn das Programm /bin/mount das suid-bit hat.

Ja, das Script ist i.O.

Bye, Klaus

bei Antwort benachrichtigen
edico Klaus_T „ /dev/cdrom /cdrom auto ro,noauto,user,exec 0 0 /dev/fd0 /floppy auto...“
Optionen

Merci, Klaus.
edico

bei Antwort benachrichtigen