• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Erfahrener Shellprogrammierer gesucht für Skript!!!

Also zu meinem Problem ich wollte mir ein shell skript schreiben um meine vdr dateien in mpg automatisch zu wandeln doch leider bin ich in meiner Schule in Informatik noch nicht so weit dass ich dass Verwirklichen könnte!!!

Deswegen wollte ich fragen ob mir jemand bei meinem Problem helfen könnte!!!


Als der Mountpunkt von dem dass skript loslaufen soll ist /video
Also eigentlich soll er jeweils in video in jeden Ordner gehen dann wieder in einen ordner dort 2 befehle ausführen vdrsync und tcmplex und dann dass mpg file nach dem 1. Ordner.mpg bennen und nach /video verschieben.

Beispiele für video damits klarer wird anhand von 2 Filmen

./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/001.vdr
./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/index.vdr
./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/summary.v
dr
./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/002.vdr
./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/003.vdr
./Lost_in_Translation_(Lost_in_Translation)/2005-07-21.11:43.50.99.rec/debug_buf
fer.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/001.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/index.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/summary.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/002.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/003.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/004.vdr
./Paycheck_-_Die_Abrechnung_(Paycheck)/2005-07-22.06:48.50.99.rec/005.vdr

also im gropen /video/Filmname/Datumsordner/vdrdateien

Mein entwurf ich weiß es ist nicht grad viel

vdrsync * //den befehl soll er immer im 2 Ordner ausführen also in jedem unabhängig wie der ordner heißt
tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o 1.mpg // und hier soll 1.mpg durch den Namen des erstenordners.mpg(Filmname) ersetz werden.
mv Filmname.mpg /video // und hier natürlich immer den betreffenden Filmnamen moven


Na ja vielleicht kann mir da jemand helfen der erfahrung mit der Shell hat!!!
 
nur mal ein paar Pointer: wenn Du ein konkretes Problem hast, melde Dich:

Code:
 A="/foo/bar/baz(Film)/datum/"
das sei unser Pfad....

den Verzeichnisnamen extrahieren:
Code:
$ echo $(basename ${A%$(basename $A)/})
baz(Film)

basename hat eine Manpage, ${...} ist etwas bashism ;) suche String-Bearbeitung in der Bash-Manpage

jetzt also nur den Filmnamen:
Code:
$ echo $(basename ${A%$(basename $A)/}) | sed -e 's/[^(]*(\(.*\))/\1/'
Film
hier also noch mal man sed dranhängen... ansonsten statt echo einfach ein
Code:
FILM=$($(basename ${A%$(basename $A)/}) | sed -e 's/[^(]*(\(.*\))/\1/')

echo "$FILM.mpg"
und Du kannst mit kompletten Namen arbeiten...
 
ich bräuchte mal kurz hilfe!!!

#!/bin/sh
ls -d * > 1.txt


a= //3 Eintrag aus der 1.txt
cd */2005*.rec
vdrsync *
tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o $a.mpg
mv *.mpg /video
cd ../..
rm -R "$a" // hier wird der ordner gelöscht damit ich schleifen kann


Da wo 3 Eintrag steht da müsste ich irgndwie den 3 Eintrag aus der Datei 1.txt reinfrimeln wie bekomm ich dass hin weiß dass jemand???
Und dann halt aus dem ganzen ne schleife machen!!!
 
cyrix20 schrieb:
ich bräuchte mal kurz hilfe!!!

#!/bin/sh
ls -d * > 1.txt


a= //3 Eintrag aus der 1.txt

es ist gefählich sich auf die Reihenfolge eines ls zu verlassen...

ansonsten
Code:
DRITTEREINTRAG=$(ls -d * | head -n 3 | tail -n 1)
ohne temp-Datei

wie gesagt ich finde das problematisch mit dem ls -d...
Da wo 3 Eintrag steht da müsste ich irgndwie den 3 Eintrag aus der Datei 1.txt reinfrimeln wie bekomm ich dass hin weiß dass jemand???
Und dann halt aus dem ganzen ne schleife machen!!!
so 3. Eintrag ist ja klar, aber worum und worüber soll eine Schleife laufen?
 
Danke nochmal na ja jetzt noch die Schleife aber ansonsten läufts wunderbar!!!!

Wegen meinem mießen Programmier stiel ich hab mir dass was du gepostet hast 3 stunden angesehen und ausprobiert doch leider bin ich nicht dahinter gestiegen was das alles soll!!! (Mangelnde Programmierkenntnisse) deswegen habe ich versucht das Problem auf meine Primitive Art doch noch zu lösen!!!!

i=0
b=20
if ["$i = $b"] //X1
then
echo Fertig
else
echo $i
cd /video/temp
a=$(ls -d * | head -n 1 | tail -n 1)
echo $a
cd */2005*.rec
vdrsync *
tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o $a.mpg
mv *.mpg /video
cd ../..
rm -R $a
fi


Na ja wie gesagt ich kanns halt nicht so besonders hab mein bestes getan unswar den ganzen Tag über aber weiter gings nicht mir fehlt wohl dass Verständniss!!!

Könntest du mir vielleicht noch mit der Schleife Helfen da wo X1 steht da hätte ich gern denn Befehl "If there is a directory" drin aber so exotische dinger findet man nicht im Internet weißt du vielleicht wie man dass Formuliert????

Vielen Dank!!!
 
Leider muss ich´s so hart sagen.

Schmeiß das weg sonst geht es in die Hose.

Erklär lieber mal was du vorhast, dann können wir dir mal ein Beispiel dazu bringen, das du dann weiterentwickeln kannst.

Mir stellen sich bei deinem Beispiel meherere fragen:
  • Was willst du mit $i u. $b erreichen.
  • Wozu brauchst du $a, bzw. was erwartest du an der Stelle.
  • was passsiert mit "cd */2005*.rec" wenn´s in /video/temp mehrere Verzeichnisse gibt.
Ich denke mal du willst folgendes:

Code:
TEMP=/video/temp
cd ${TEMP}
for dir in *
do
   if [ -d $dir ]; then
      cd ${TEMP}/${dir}/2005*.rec
      echo `pwd` wird abgearbeitet
      vdrsync *
      tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o ${dir}.mpg 
      mv *.mpg /video
   fi
done
Das ganze hat noch den Haken, dass es in ${TEMP}/${dir}/ nur ein Verzeichnis nach dem Muster 2005*.rec geben darf besser ist:
Code:
TEMP=/video/temp
cd ${TEMP}
for dir in *
do
   if [ -d "${TEMP}/${dir}" ]; then
      for subdir in *
      do 
         cd "${TEMP}/${dir}/${subdir}"
         echo `pwd` wird abgearbeitet
         vdrsync *
         tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o ${dir}-${subdir}.mpg 
         mv *.mpg /video
         done
   rm -rf "${TEMP}/${dir}"
   fi
done


Allerdings sind beide Beispiele noch quick and dirty, da keine Fehlerbehandlungen gemacht werden.

edit by nobbiew
Beide Beispiel ausgebessert
 
nobbiew schrieb:
Leider muss ich´s so hart sagen.

Schmeiß das weg sonst geht es in die Hose.

hey mach mal langsam, ich finds gut, dass er es zumindest mal versucht hat und auch Sein Script kann man mit Sicherheit reparieren oder zum laufen bringen, meine ersten Shellscripte sahen mit Sicherheit auch nicht besser aus...

@cyrix20:
Was sollte jetzt klar geworden sein:
Du musst Dir klarmachen, was will ich, was weiß ich, wie liegen die Informationen vor.

Irgendwie scheinst Du das selber nicht zu wissen, denn vorher fragst Du noch nach dem 3. Eintrag in dem Directory-Listing jetzt bastelst Du aber mit head -n1 und tail -n 1 an dem 1. Eintrag rum...

nobbiew schrieb:
Erklär lieber mal was du vorhast, dann können wir dir mal ein Beispiel dazu bringen, das du dann weiterentwickeln kannst.
as I said: erklär genau, was Du machen willst, dann kann man auch Dein Beispiel weiter entwicklen.


Code:
TEMP=/video/temp
cd ${TEMP}
for dir in *
do
   if [ -d $dir ]; then
      cd ${TEMP}/${dir}/2005*.rec
      echo `pwd` wird abgearbeitet
      vdrsync *
      tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o ${dir}-${subdir}.mpg 
      mv *.mpg /video
   fi
done

auf soetwas wird das rauslaufen, um das aber zu verstehen, solltest Du Dir Dein Script noch mal ansehen und das manuell in der Shell ausprobieren denn spätestens dann wäre Dir aufgefallen, dass ein "cd */2005*.rec" nicht viel Sinn macht....
 
@TeXpert
Sorry für die harten Worte, ich will ihn nicht vergraulen.

@cyrix20
Ich find´s ja auch gut, dass du dich da ranwagst, aber wie TeXpert schon erklärt hat. Mach dir klar was du willst, und woh du hinwillst.

Deswegen solltest du dir erst mal in deinen Worten ausformulieren, wie das Programm ablaufen soll. Das nimmst du dann als Gerüst und entwickelst dann die einzelnen Schritte.

Wenn du mit einzelnen Abfragen u. Problemstellungen nicht weiterkommst, helfen wir dir gerne weiter.

Ach übrigens hier noch ein Tipp um Info´s zu bekommen:
Starte mal den konqueror und gib in der Adresszeile
#bash bzw ##bash ein (Probier ruhig beide aus).
Damit bekommst du neben den üblichen Kommadozeilenparemetern auch viele nützliche Tipps für die Shellprogrammierung. Das funktioniert übrigens mit sehr vielen Programmen für die Kommandozeile. Im Grunde sind das zwar nur die sog. Manpages bzw. Info-Seiten, die die Programme mitbringen, kann man damit wesentlich angenehmer arbeiten wie mit den Kommandos man u. info
 
um etwas einfacher mit der bash zu arbeiten gibt es auch noch die bash-completion:
http://www.caliban.org/bash/index.shtml#completion

Das ist eine Erweiterung die dir die einzelnen Optionen zu den Programmen anzeigt:
Beispiel:apt-get[tab][tab] liefert dann
Code:
autoclean        check            dist-upgrade     install          source           upgrade
build-dep        clean            dselect-upgrade  remove           update

ansonsten kannst du dich hier noch etwas schlau machen zur bash:
Advanced Bash-Scripting Guide
An in-depth exploration of the art of shell scripting
http://www.tldp.org/LDP/abs/html/

dort sind auch viele Beispiele enthalten.
 
Ok dass skript läuft hihi und sogar im kreis

Vielleicht wills sich s ja Kopieren also kleine anleitung

Skript nach /video
Ordner erstellen /video/temp
alle VDR Filme nach /video/temp verschieben
skript ausführen
Anmerkung: Im Ordner /video/temp dürfen NUR VDR Ordner drin seine keine anderen Dateien denn dann schmierts ab
Achtung die Filme in /video/temp werden nacheinander gelöscht
die mpgs entstehen in /video
So nun mein angepasstes Skript läuft wunderbar

#!/bin/sh
TEMP=/video/temp
cd ${TEMP}
for dir in *
do
if [ -d $dir ]; then
cd /video/temp
a=$(ls -d * | head -n 1 | tail -n 1)
#cd ${TEMP}/${dir}/2005*.rec
echo `pwd` wird abgearbeitet
vdrsync *
tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o $a.mpg
mv *.mpg /video
cd ../..
rm -R $a

fi
done


Sorry @Texpert der Befhl ${dir}-${subdir} hat hinter jedem Namen ein Bindestrich gesetz der in wirklichkeit nicht vorhanden ist dem entsprechend hat der letzte rm befehl nicht funktioniert!!! Da er immer Name- löschen wollte, und der ordner nur den Namen hat ohne - !!!


Vielen dank nochmal ich bin voll zufrieden!!!!
 
Sorry, aber ich muss das dann doch noch mal korrigieren, da es sonst du unerwünschten Nebeneffekten kommen kann, bzw. die hast du schon:
#!/bin/sh
TEMP=/video/temp
cd ${TEMP}
for dir in *
do
if [ -d $dir ]; then
cd /video/temp
a=$(ls -d * | head -n 1 | tail -n 1)
#cd ${TEMP}/${dir}/2005*.rec
echo `pwd` wird abgearbeitet
vdrsync *
tcmplex -i vdrsync.mpv -0 vdrsync0.mpa -m d -o $a.mpg
mv *.mpg /video
cd ../..
rm -R $a

fi
done
Hier passiert folgendes, und darum schmiert es auch ab wenn Einfache Dateien im Verzeichnis /video/temp
liegen:
Code:
for dir in *
beginnt eine Schleife die einfach alles im Verzeichnis /video/temp auflistet

Code:
cd /video/temp
wechselt in das Verzeichnis in dem du sowieso gerade stehst.
Code:
a=$(ls -d * | head -n 1 | tail -n 1)
sollte nach deiner logik eigentlich dafür sorgen, dass $dir = $a ist. Aber das ist nicht immer der fall, da das davon abhängt, ob "for dir in *" genauso auflistet.
Code:
echo `pwd` wird abgearbeitet
sollte immer ausgeben
/video/temp wird abgearbeitet

Also schau dir noch mal mein 2. Beispiel von oben an. Daher kommt auch leider der Fehler mit dem subdir. Ich hatte das nachträglich vom 2. Beispiel ins 1. kopiert und vergessen das anzupassen.

Mit dem 2. Beispiel sollte es auch nicht mehr abstürzen und wie gesagt, es müssten noch ein paar Fehlerbehandlungen eingebaut werden (z.B. dass das Verzeichnis nur dann gelöscht wird, wenn die Konvertierung erfolgreich abgeschlossen ist).
 
cyrix20 schrieb:
a=$(ls -d * | head -n 1 | tail -n 1)

diese Zeile ist der Absolute Hack ;) und doppelt gemoppelt

head -n1 liefert genau 1 Zeile und davon genau die letzte ist unnötig.


dann: Du sagst, Script nach /video wichtiger für das for i in * ist, von Wo Du das ausführst...

Du willst doch eingendlich eine Schleife um alle Verzeichnisse in "/video/temp " machen, und da eins nach dem anderen bearbeiten, dann mach das doch einfach:

Code:
for VIDDIR in /video/temp/*
do
  do something whith $VIDDIR
done

in $VIDDIR steht dann /video/temp/foobar drin, aber wie Du schon am Anfang gesehen hast, mit "basename $VIDDIR" bekommst DU auch nur den Verzeichnissnamen...

Alternativ:
Code:
cd /video/temp
for VIDDIR in *
do
  do something whith $VIDDIR
done
dann steckt nicht der ganze Pfad mit drin.

Dann noch ein kleines Sicherheitsnetz:
Code:
    if [ ! -d "$VIDDIR" ] ; then continue ; fi
in die for-Schleife, dann werden alle zufällig aufgefundenen Dateien ignoriert...

Zusammengefasst: ich finds gut, dass Du es selber fertig bekommen hast, aber das kommt mir nicht durchdacht vor...
 
Oben