kanotix.com

Scripte - toolame oggdec; leerzeichen parameter shell

Witwe_Bolte - 25.06.2006, 10:44 Uhr
Titel: toolame oggdec; leerzeichen parameter shell
mein 1. Versuch mit sed hakt vielleicht doch nur an toolame:
meine ogg-Dateien werden im aktuellen Verzeichnis so in wav umgewandelt:
find -type f|sed -e 's/['.']['/']//' -e 's/Joss/"&/g' -e 's/ogg/&"/g'|xargs oggdec
(Nicht auf die Détails in sed achten. Damit setz ich die Dateinamen nur in Doublequotes, weil sie Leerzeichen enthalten und die fangen halt alle mit 'Joss' an.)
soweit so gut. um die wav-dateien jetzt in mp3 umzuwandeln, hab ich es so versucht:
find -type f|grep wav|sed -e 's/['.']['/']//' -e 's/Joss/"&/g' -e 's/wav/&"/g'|toolame
Da antwortet mir toolame mit "USAGE usw."
Soweit ersichtlich hab ich auch alle Varianten mit xargs oder xargs -0 vor toolame durch, egal, ob ich wav mit grep oder mit find *wav rausfiltere.
Bei diesen Varianten meldet toolame "excess arg". Für Exzesse hab ich ja grds eine Schwäche.
Aber hilft mir hier einer?
makke - 25.06.2006, 11:17 Uhr
Titel: toolame oggdec; leerzeichen parameter shell
Ich würde eine einfache for-schleife machen.
Witwe_Bolte - 25.06.2006, 12:31 Uhr
Titel: RE: toolame oggdec; leerzeichen parameter shell
danke für die prompte antwort. damit hatte ich erstmal angefangen. hab das ergebnis von find und sed in ne variable eingelesen und über die die for-schleife laufen lassen. toolame $datei in der schleife führte aber zum gleichen ergebnis, obwohl zwei echos sowohl die liste als auch den dateinamen richtig ausgegeben haben.
beim versuch, find an ein array zu übergeben, bin ich trotz D i c k e m shell-buch wohl an der syntax gescheitert.
makke - 25.06.2006, 13:53 Uhr
Titel: RE: toolame oggdec; leerzeichen parameter shell
wobei ich den sinn: ogg -> wav -> mp3 nicht ganz verstehe
jede kodierung bringt wieder einen qualitätsverlust
http://kanotix.com/index.php?name=PNphp ... mp;t=15873
Witwe_Bolte - 26.06.2006, 08:16 Uhr
Titel:
Schon klar. Das ist auch der Weisheit letzter Schluß.
**censored** bekomme ich sonst auf 64bit nicht hin. Und meine CDs habe ich zum großen Teil als ogg auf der Platte. Hab nix gefunden, was direkt von ogg nach mp3 konvertiert. Der Player im neuen Auto von Weibi kann entgegen meinem Auftrag aber doch nur mp3 spielen. Keine Lust mit dem Autohaus zu streiten, weil ich schon hauptberuflich streite.
Außerdem wollte ich endlich mal was mit der Shell machen außer an fertigen Skripten rumzufummeln. ( Deinen Link kannte ich schon. Hab natürlich vorher das Forum durchwühlt.)
Witwe_Bolte - 29.06.2006, 21:55 Uhr
Titel: Bitte nochmal:
Jetzt hab ich es mit Variablen und Pipes direkt aufgegeben.
Mit
ls -1Q>>dirliste
hab ich erstmal alle Dateinamen in Anführungszeichen zeilenweise in dirliste.
Mache ich dann
while read i
do
oggdec $i
done < dirliste
beklagt sich oggdec, daß es die Datei nicht findet.
Mache ich in der while-schleife statt oggdec echo, wird brav zeilenweise in Anführungszeichen ausgegeben.
Daß oggdec * im CWD brav seine Arbeit versieht, bringt mich nicht weiter. Dann lern ich das ja nie Traurig
Kano - 29.06.2006, 21:56 Uhr
Titel: Bitte nochmal:
toolame ist kein mp3, das ist mpeg 1 layer 2 und nicht 3.
Witwe_Bolte - 09.07.2006, 07:40 Uhr
Titel:
stimmt schon. Weil es aber problemlos abgespielt wird, ist mir das egal.
Das mit den Leerzeichen hab ich zwischenzeitlich mit Python erledigt. Ist eh hübscher.
schnorrer - 09.07.2006, 12:52 Uhr
Titel:
problem von tolame es kann Leehrzeichen nicht richtig verarbeiten, vor allem wenn sie per Pipe übergeben werden.
wandle alle filenamen mit leerzeichen in solche mit '_'.

ine einer Schleife:

for $datei
do
tolame $datei -weitere_parameter -parameter
shift $datei
done
Kano - 09.07.2006, 15:44 Uhr
Titel:
Man kann sich auch mit dem Fuss am Kopf kratzen, wenn man will Winken

toolame erstellt mp2, ergo - direkt ohne wav:

for x in *.ogg; do ogg123 "$x" -dwav -f-|toolame - "$(echo $x|sed s/ogg/mp2/)" ; done

Wer aus was für Gründen auch immer mit nem wav Zwischenfile arbeiten will:

for x in *.ogg; do oggdec "$x"; toolame "$(echo $x|sed s/ogg/wav/)" "$(echo $x|sed s/ogg/mp2/)" ; done
Witwe_Bolte - 09.07.2006, 15:47 Uhr
Titel:
Danke Schnorrer. Glaube ich eher nicht, weil toolame keine Probleme hat, wenn direkt eine Datei in Anführungszeichen mitgegeben wird.
Die Umbennung gefällt mir ebensowenig wie mit $IFS rumzuhantieren. Ursprungsdatei und Shell-Umgebung sollen unberührt bleiben. Fall es einer brauchen kann, hier meine python Lösung:
#!/usr/bin/env python
import os, string, re

def main():

liste=os.listdir(os.getcwd())
for datei in liste:
if re.search('.ogg',datei) is False:
continue
eingabe='"'+datei+'"'
kommando='oggdec '+eingabe
os.popen(kommando,'w')
liste=os.listdir(os.getcwd())
for datei in liste:
if re.search('.wav',datei) is False:
continue
eingabe='"'+datei+'"'
kommando='toolame '+eingabe
os.popen(kommando,'w')
main()

Wer bei Python ähnlich neu ist: Die Einrückungen werden beim Schriben zwar angezeigt, im Forum dann aber nicht. Muscha von Hand machen. (Aber das kennen wir Computer-Menschen ja nicht anders Smilie)
Beim Aufruf aus ner Shell muß man also in dem verzeichnis sein, in dem die Dateien liegen.
Ob re hier überhaupt richtig verwendet wurde, weiß ich nicht. Ist aber nicht so tragisch, da das Skript jedenfalls nicht abbricht.
Kano - 09.07.2006, 15:53 Uhr
Titel:
Was für ne schöne kurze Scriptsprache Winken
slam - 09.07.2006, 18:09 Uhr
Titel:
Man könnte auch code-Boxen verwenden, die hier im Forum freizügig und gratis angeboten werden - dann wird die Wurst wenigstens leserlich ...
Greetings,
Chris
Witwe_Bolte - 18.07.2006, 12:19 Uhr
Titel: liest ja jetzt eh keiner mehr
...dann kann ich das ja jetzt mal mit dieser Code-Box probieren.
Here we go:
Code:

#!/usr/bin/env python
import os, string

def main():
   
   liste=os.listdir(os.getcwd())
   for datei in liste:
      if datei.endswith('ogg') == False:
         continue
      eingabe='"'+datei+'"'
      kommando='oggdec '+eingabe
      os.popen(kommando,'w')
      
   liste=os.listdir(os.getcwd())
   for datei in liste:
      if datei.endswith('wav') == False:
         continue
      eingabe='"'+datei+'"'
      kommando='**censored** '+eingabe
      os.popen(kommando,'w')
      
   kommando='rm -f *.wav'
   os.popen(kommando,'w')
   
main()


Kano - 18.07.2006, 12:29 Uhr
Titel: RE: liest ja jetzt eh keiner mehr
Kleine Variante mit basename statt sed:

for x in *.ogg; do ogg123 "$x" -dwav -f-|toolame - "$(basename "$x" .ogg).mp2"; done
Witwe_Bolte - 18.07.2006, 15:01 Uhr
Titel: Wow. Der Shellmeister
Sehr glücklich
Ist natürlich schicker. basename kannte ich gar nicht ( is es e wunder? )
Danke nochmal. Vielleicht kann ich noch mit nem Python vs. Bash Benchmark auftrumpfen Smilie

später: nö. schneller gehts mit scrpiting kaum.
Ne Idee, warum jetzt die Leerzeichen im Dateinamen bei toolame durchlaufen?
Kano - 18.07.2006, 15:16 Uhr
Titel: RE: liest ja jetzt eh keiner mehr
Nun deine Lösung geht über Zwischenfiles, die brauchen Platz, bringen aber nichts. Der Zeitaufwand sollte wohl ähnlich sein.
Witwe_Bolte - 21.07.2006, 08:25 Uhr
Titel: Leerzeichen und ich schon wieder
Mein Problem bleiben die Leerzeichen in Pfade und Dateinamen.
Warum Deine for-Schleifen funzen und meine nicht, kapier ich nicht. Habe mit find -print0 und xargs -0 wohl alles durch. Selbst wenn die Ausgabe von xargs -0 brav den ganzen Namen in "" ausgibt, bekommt zB rm immer die einzelnen Wörter. Das gleiche mit Backticks. Die Exapnsio *.suffix haut bei Dir ja hin. Wie kann ich aber mit ner Schleife Verzeichnisbäume mit Leerzeichen durchlaufen. Außer ls und find ist mir bisher nix eingefallen.
Muß ich vielleicht doch IFS mit " oder \n überschreiben?
Bleibt das dann für diese shell oder diesen Prozeß privat oder wird das global (i trau mi ned). Soifz
schnorrer - 21.07.2006, 13:51 Uhr
Titel: RE: Leerzeichen und ich schon wieder
warum kanos zeile funzt ist doch klar. "*.og".
" != '' != ' ' das geht leider nicht. das müßte so " " heißen. '' ist ein NULL zeichen. nix nada.

'%20' geht wieder.

Kano löst es mit dem Stern for der erweiterung. Und Stern heißt alle Zeichen in der kette.
Witwe_Bolte - 21.07.2006, 15:18 Uhr
Titel:
@Schnorrer: Daß for x in *.ogg expandiert wird, war mir schon klar. Davon gehen aber die Leerzeichen in den Dateinamen nicht weg. In der Expansion werden die Leerzeichen aber weder escaped, noch werden die Ausgaben in "" gesetzt. Beispiel: for x in *; do echo $x; done gibt brav alle Dateien und Verzeichnisse zeilenweise aus. Jetzt kommts:
for x in *; do echo $x && ls; done findet bei ls die Namen mit den Leerzeichen nicht.
Vielleicht vergeht das Brett vor meinem Hirn in den nächsten 2 Wochen. Bin Jetzt erst mal im Urlaub.
Besorgt mir bis dahin das ultimative AHA-Erlebnis. (bittebitte)
schnorrer - 21.07.2006, 18:26 Uhr
Titel:
ls hat schon immer ein Problem mit Leerzeichen gehabt.

for x in *;
do
echo $x && ls; ### gib nur etwas aus wenn die Expr == true ist. also kein LS, da echo $x ja nicht "ls" auspuckt.
### fahre ohne Ausgabe bei done fort.
done


for x in *;
do
echo $x,
ls;
done

das ist was du willst.
Witwe_Bolte - 07.08.2006, 17:49 Uhr
Titel: @schnorrer
1. Tag nach dem Urlaub
öhömm. Nit böse sein, aber ich glaube, daß keines von den beiden das tut, was Du glaubst:
Das erste macht nach jedem echo einfach ls. Der return von echo ist ja zumindest solange TRUE, solange echo was ausgeben kann.
Das zweite schreibt nach der echo-Ausgabe einfach 'ls'. Klar. Was auch sonst. in dem Ausdruck echo $x, ls wird eben das $x expandiert. Sonst nix.
BTW: ls ist eines der tools, das gerade keine Probleme mit Leerzeichen hat.
Kano - 07.08.2006, 17:58 Uhr
Titel: RE: @schnorrer
Du solltest meinen code nochmals angucken, in deinem Beispiel vergisst du IMMER die "" um "$x".
Witwe_Bolte - 08.08.2006, 00:50 Uhr
Titel: da brichsch zamm
oder so. Cool

ne Woche später:
WOW: for x in */*/* geht auch. Wahnsinn. Mächtig.
Äh: Wie tief geht denn das? Da wüßte ich gar nicht wonach ich googeln sollte.
Alle Zeiten sind GMT + 1 Stunde
PNphpBB2 © 2003-2007