Hallo erstmal, Am Dienstag, 19. Juni 2001 um 19:20 schrieb Juergen Schwarting / Sascha Peters:
* Am 18.06.2001 um 22:12 Uhr schrieb Sascha Peters:
#!/bin/sh for file; do mpg123 -vw "$(basename $file .mp3).wav" "$file" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ versuch es mal mit "${file%%mp3}wav"
kann ich gerne machen auch wenn ich nun ganz andere Probleme habe! Das mit dem Sortieren und der Textdatei hörte sich gut an. Also ls umleiten in Textdatei und dann scheiben for xxx in $cat Textdatei); do aber dann kommt der mit den Leerzeichen in den Namen nicht mehr klar! geht das auch irgendwie? -- Mit freundlichen Grüssen Sascha Peters linux@progressing.de
Hallo erstmal, Am Mittwoch, 20. Juni 2001 um 12:13 schrieb Sascha Peters:
Am Dienstag, 19. Juni 2001 um 19:20 schrieb Juergen Schwarting:
* Am 18.06.2001 um 22:12 Uhr schrieb Sascha Peters:
#!/bin/sh for file; do mpg123 -vw "$(basename $file .mp3).wav" "$file" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ versuch es mal mit "${file%%mp3}wav"
Das klappt übrigens gervorragend, aber habe ich immernoch das Problem das das script die Variabel "file" ja per Shell Parameter bekommt. % SCRIPT.SH *.mp3 zum Beispiel. Aber ich habe die Dateien noch nicht im System da ich sie erst noch mounten muß, was aber auch das Script übernehmen soll. Wie mache ich denn es das er trotzdem die Variabel mit dem entsprechenden Wert füllt? Bisher habe ich Probleme mit den Leerzeichen im Dateinamne etc.... bitte um hilfe -- Mit freundlichen Grüssen Sascha Peters linux@progressing.de
On Mit, Jun 20, 2001 at 12:20:01 +0200, Sascha Peters wrote:
Am Mittwoch, 20. Juni 2001 um 12:13 schrieb Sascha Peters:
Am Dienstag, 19. Juni 2001 um 19:20 schrieb Juergen Schwarting:
* Am 18.06.2001 um 22:12 Uhr schrieb Sascha Peters:
#!/bin/sh for file; do mpg123 -vw "$(basename $file .mp3).wav" "$file" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ versuch es mal mit "${file%%mp3}wav"
Auch die obere Variante sollte übrigens laufen, da basename bei entspr. Angabe auch den Suffix abtrennt, also $ basename /tmp/abc.mp3 .mp3 abc $
Das klappt übrigens gervorragend, aber habe ich immernoch das Problem das das script die Variabel "file" ja per Shell Parameter bekommt. % SCRIPT.SH *.mp3 zum Beispiel. Aber ich habe die Dateien noch nicht im System da ich sie erst noch mounten muß, was aber auch das Script übernehmen soll. Wie mache ich denn es das er trotzdem die Variabel mit dem entsprechenden Wert füllt? Bisher habe ich Probleme mit den Leerzeichen im Dateinamne etc....
Verstehe ich Dich richtig, dass Du die mp3-Dateinamen erst zur Laufzeit des Scripts ermitteln willst? Dann gib ihm doch das Scuhmuster als Suchmuster mit: script.sh '*.mp3' Und im Script machst Du dann: for i in $1; do do_something done Ich habe den Anfang vom Thread nicht mehr, aber nach dem, was ich gelesen habe, willst Du: - alle mp3-Dateien von irgendeinem Datenträger (CD-ROM o. ä.) einlesen - alphabetisch sortieren - in .wav umwandeln Korrekt? Wie wäre es dann (inkl. Leerzeichen ;-) mit folgendem Verfahren: <ungetestet> [mounten und was noch so gemacht werden soll] cd /pfad/zum/mp3/verzeichnis ls $1 | while read datei; do mpg123 -vw "/pfad/zum/ziel/$(basename "$datei" .mp3).wav" "$datei" done </ungetestet> Der ls sortiert, es wird also keine temp. Datei benötigt und der read liest inkl. Leerzeichen. Jan P.S.: Ich würde prinzipiell keine Variable $file nennen. file ist ein Standard-Unixkommando und das kann zu Verwechslungen führen.
Hallo erstmal, Am Mittwoch, 20. Juni 2001 um 13:40 schrieb Jan Trippler / Sascha Peters:
Verstehe ich Dich richtig, dass Du die mp3-Dateinamen erst zur Laufzeit des Scripts ermitteln willst? Dann gib ihm doch das Scuhmuster als Suchmuster mit:
Ja in etwa, aber die einzelnen Verzeichnisse und die Löschung der Dateien sind in dieser Schleife ja dann kein Problem mehr! Ich habe das auch schon hinbekommen das die MP3´s zu WAV Dateien werden und in ein anderes Verzeichnis gelangen. Aber Ich habe den Mount Befehl da nicht bei.
script.sh '*.mp3' Und im Script machst Du dann: for i in $1; do do_something done
So rufe ich mein Script doch auch auf, es klappt auch aber eben ohne den Mount Befehl.
Wie wäre es dann (inkl. Leerzeichen ;-) mit folgendem Verfahren: <ungetestet> [mounten und was noch so gemacht werden soll]
hier ist der knackpunkt. Wenn ich doch Das script mit dem Parameter "*.mp3" aufrufe dann will der doch im aktuellen Verzeichnis nach den Dateien die er dann in der Schleife als Variable wieder einsetzt haben. Und da ich nicht in dem Verzeichnis das das Script erst noch mountet sein kann geht das doch nicht! Oder sehe nun ich das falsch? Das Script soll komplett auf einem Netzpfad arbeiten und diesen erst im Script erstellen und auch wieder trennen! So wie Du das meinst bekäme ich das nur in zwei Scripten hin die sich gegenseitig aufrufen, bzw. das eine das andere Aufruft. Wobei ich da nicht weiß wie das eine dann wartet bis das andere Ferig ist. Es muß doch alles in einem Script möglich sein!
cd /pfad/zum/mp3/verzeichnis ls $1 | while read datei; do mpg123 -vw "/pfad/zum/ziel/$(basename "$datei" .mp3).wav" "$datei" done </ungetestet>
So in etwa sieht doch mein Script auch aus, aber das ist auch das einzige was an dem Script funktioniert.
Der ls sortiert, es wird also keine temp. Datei benötigt und der read liest inkl. Leerzeichen.
gut zu wiessen aber die Sortierung muß nicht wirklich sein! habe nurmal drüber Nachgedacht!!!
P.S.: Ich würde prinzipiell keine Variable $file nennen. file ist ein Standard-Unixkommando und das kann zu Verwechslungen führen.
habe ich nur von jemanden hier auf der Liste übernommen, wußte aber auch nicht wie man die Parameter bezeichnet, oder ob das immer die selben sind! -- Mit freundlichen Grüssen Sascha Peters linux@progressing.de
On Mit, Jun 20, 2001 at 06:50:25 +0200, Sascha Peters wrote:
Am Mittwoch, 20. Juni 2001 um 13:40 schrieb Jan Trippler / Sascha Peters:
script.sh '*.mp3' Und im Script machst Du dann: for i in $1; do do_something done
So rufe ich mein Script doch auch auf, es klappt auch aber eben ohne den Mount Befehl.
Das glaube ich nicht. Setzt Du das Argument *.mp3 wie oben in einfache Hochkommata? Dann expandiert die Shell nämlich das Argument nicht mehr und es kommt uverändert im Script an, so dass Du es wie oben beschrieben benutzen kannst.
Wie wäre es dann (inkl. Leerzeichen ;-) mit folgendem Verfahren: <ungetestet> [mounten und was noch so gemacht werden soll]
hier ist der knackpunkt. Wenn ich doch Das script mit dem Parameter "*.mp3" aufrufe dann will der doch im aktuellen Verzeichnis nach den Dateien die er dann in der Schleife als Variable wieder einsetzt haben. Und da ich nicht in dem Verzeichnis das das Script erst noch mountet sein kann geht das doch nicht! Oder sehe nun ich das falsch?
Siehe oben. Du musst nur die Shell daran hindern, das Suchmuster zu expandieren. Das Mounten hat damit überhaupt nichts zu tun. Übergib den Parameter wie oben beschrieben (wozu brauchst Du ihn überhaupt? Willst Du u. U. auch andere Formate umwandeln?), führe im Script ganz normal den mount aus, wechsle in das Verzeichnis auf CD (oder im Netz - das ist vom Prinzip egal) und jage die read-Schleife drüber.
Das Script soll komplett auf einem Netzpfad arbeiten und diesen erst im Script erstellen und auch wieder trennen! So wie Du das meinst bekäme ich das nur in zwei Scripten hin die sich gegenseitig aufrufen, bzw. das eine das andere Aufruft. Wobei ich da nicht weiß wie das eine dann wartet bis das andere Ferig ist. Es muß doch alles in einem Script möglich sein!
Naja, siehe oben ;-) BTW: Wenn Du aus einem Skript heraus ein anderes aufrufst, dann wartet das aufrufende standardmäßig. Das ist nicht anders als in einer interaktiven Shell. Willst Du das nicht, musst Du das aufgerufene Skript in den Hintergrund schicken ( & hintenran). Aber das brauchst Du ja nicht.
cd /pfad/zum/mp3/verzeichnis ls $1 | while read datei; do mpg123 -vw "/pfad/zum/ziel/$(basename "$datei" .mp3).wav" "$datei" done </ungetestet>
So in etwa sieht doch mein Script auch aus, aber das ist auch das einzige was an dem Script funktioniert.
Noch eine andere Variante, wenn Du Dich nicht mit der Dateinamen-Expansion der Shell rumschlagen willst: Übergib dem Script einfach nur die Endung: script.sh mp3 und im Script nimmst Du dann: ls *.$1 | while read datei; do ... Viele Wege führen zur schwarzgebrannten CD ;-) Jan P.S.: Es ist nicht nötig, dass Du die Mails zusätzlich an mich per PM schickst. Ich lese die Liste mit.
Hallo erstmal, Am Mittwoch, 20. Juni 2001 um 19:48 schrieb Jan Trippler / Sascha Peters:
Das glaube ich nicht. Setzt Du das Argument *.mp3 wie oben in einfache Hochkommata? Dann expandiert die Shell nämlich das Argument nicht mehr und es kommt uverändert im Script an, so dass Du es wie oben beschrieben benutzen kannst.
Das wußte ich nicht dann habe ich das total mißverstanden, sorry!
BTW: Wenn Du aus einem Skript heraus ein anderes aufrufst, dann wartet das aufrufende standardmäßig. Das ist nicht anders als in einer interaktiven Shell. Willst Du das nicht, musst Du das aufgerufene Skript in den Hintergrund schicken ( & hintenran).
Danke wird wohl dann kurze Zeit so laufen! bis ich dann mit Deiner und eurer Hilfe das hinbekommen habe "richtig" zu machen!
Aber das brauchst Du ja nicht.
doch, noch!!!
cd /pfad/zum/mp3/verzeichnis ls $1 | while read datei; do mpg123 -vw "/pfad/zum/ziel/$(basename "$datei" .mp3).wav" "$datei" done </ungetestet> Noch eine andere Variante, wenn Du Dich nicht mit der Dateinamen-Expansion der Shell rumschlagen willst: Übergib dem Script einfach nur die Endung: script.sh mp3
und im Script nimmst Du dann: ls *.$1 | while read datei; do ...
Mal eine andere Frage, ich versuche das gerade mal anzuwenden, aber das bekomme ich nicht in die Reihe! $1 steht da für Parameter eins und das soll dann also die Suchmaske sein den "ls" Befehls! oder? und diese wird dann umgeleitet auf eine schleife! aber ist "datei" auch eine Variable oder was? ich kann das gedanklich nicht nachvollziehen. Wäre nett wenn das einer erklären könnte. -- Mit freundlichen Grüssen Sascha Peters linux@progressing.de
* Sascha Peters schrieb am 20.Jun.2001:
Am Mittwoch, 20. Juni 2001 um 19:48 schrieb Jan Trippler / Sascha Peters:
Dateinamen-Expansion der Shell rumschlagen willst: Übergib dem Script einfach nur die Endung: script.sh mp3
und im Script nimmst Du dann: ls *.$1 | while read datei; do
Mal eine andere Frage, ich versuche das gerade mal anzuwenden, aber das bekomme ich nicht in die Reihe! $1 steht da für Parameter eins und das
Ja. Hier z.B mp3.
soll dann also die Suchmaske sein den "ls" Befehls! oder? und diese wird
Wenn Du als erstes Argument mp3 hast, dann ersetzt die Shell *.$1 mit allen Dateien im aktuellen Verzeichnis, die nicht mit einem . anfangen und mit .mp3 enden. Ist das Argument hingegen wav, so werden alle Dateien im aktuellen Verzeichnis genommen, die nicht mit einem . beginnen und mit .wav enden.
dann umgeleitet auf eine schleife! aber ist "datei" auch eine Variable
Genaugenommen wird die Ausgabe umgeleitet, und zwar in einer pipe geleitet. Also alle Dateinamen, die passen. Ja, datei ist eine Variable. Nach read kommt immer der Bezeichner einer Variablen. ACHTUNG: Da darf kein $ vor. Bei der shell kommt bei der Auswertung einer Variablen ein $ vor den Namen, aber nur dort. Bei der Definition der Variablen darf kein $ stehen. Anstelle von datei kannst Du auch alles mögliche wählen, aber datei bietet sich hier an.
oder was? ich kann das gedanklich nicht nachvollziehen. Wäre nett wenn das einer erklären könnte.
Was ich jetzt nicht verstanden habe, macht denn außer mp3 auch noch eine andere Endung Sinn? Wenn nicht, dann könnte das doch auch mit im Skript. Und wenn es auch noch andere Endungen geben, was ist mit dem nachfolgenden basename? Müßte da nicht auch die Endung variabel sein? Aber was sonst außer mp3 könnte da noch kommen? Bernd -- Hast Du bei Problemen schon in der SuSE-Support-Datenbank (SDB) nachgesehen? Auf Deinem Rechner: http://localhost/doc/sdb/de/html/index.html | mit Apache: http://localhost/doc/sdb/de/html/key_form.html | Zufalls- Tagesaktuell bei SuSE: http://sdb.suse.de/sdb/de/html/index.html | signatur 2
Hallo erstmal, Am Donnerstag, 21. Juni 2001 um 05:01 schrieb Bernd Brodesser / Sascha Peters:
* Sascha Peters schrieb am 20.Jun.2001:
Am Mittwoch, 20. Juni 2001 um 19:48 schrieb Jan Trippler / Sascha Peters:
Dateinamen-Expansion der Shell rumschlagen willst: Übergib dem Script einfach nur die Endung: script.sh mp3 und im Script nimmst Du dann: ls *.$1 | while read datei; do soll dann also die Suchmaske sein den "ls" Befehls! oder? und diese wird Wenn Du als erstes Argument mp3 hast, dann ersetzt die Shell *.$1 mit allen Dateien im aktuellen Verzeichnis, die nicht mit einem . anfangen und mit .mp3 enden. Ist das Argument hingegen wav, so werden alle Dateien im aktuellen Verzeichnis genommen, die nicht mit einem . beginnen und mit .wav enden.
Wie könnte man denn es so einrichten das man auch Dateinamen nimmt die mit einem Punkt anfangen?
dann umgeleitet auf eine schleife! aber ist "datei" auch eine Variable Genaugenommen wird die Ausgabe umgeleitet, und zwar in einer pipe geleitet. Also alle Dateinamen, die passen.
Ja, datei ist eine Variable. Nach read kommt immer der Bezeichner einer Variablen. ACHTUNG: Da darf kein $ vor. Bei der shell kommt bei der Auswertung einer Variablen ein $ vor den Namen, aber nur dort. Bei der Definition der Variablen darf kein $ stehen. Anstelle von datei kannst Du auch alles mögliche wählen, aber datei bietet sich hier an.
danke das leuchtet mir nun ein, also wird dort diese Variabele erst definiert desewegen habe ich das auch nicht verstanden!
Was ich jetzt nicht verstanden habe, macht denn außer mp3 auch noch eine andere Endung Sinn? Wenn nicht, dann könnte das doch auch mit im Skript. Und wenn es auch noch andere Endungen geben, was ist mit dem nachfolgenden basename? Müßte da nicht auch die Endung variabel sein? Aber was sonst außer mp3 könnte da noch kommen?
Also man könnte den Script auch so schreiben das er WAV in MP3 schreibt, aber dann braucht man ja wieder ein anderes Programm als mpg123 und muß dann vorher abfragen welches Programm nun verwendet werden soll, alles machbar aber das brauche ich nicht. Ich habe das *.mp3 nun direkt in das Script mit eingebaut und das geht auch! Ich habe allerdings fast alles aus Variablen gebaut das man in seinem Homeverzeichnis sagen kann was man wie macht, zum Beispiel auch welche Verzeichnisse und auf welchen Rechner im Netz. Damit man das auch nicht jeden User als Parameter des Scriptes anhängen lassen muß! Ich schicke das Script jedem Interessierten gerne zu wenn ich fertig bin bitte dann eine PM an mich mit PM absender! -- Mit freundlichen Grüssen Sascha Peters linux@progressing.de
On Don, Jun 21, 2001 at 01:14:41 +0200, Sascha Peters wrote:
Am Donnerstag, 21. Juni 2001 um 05:01 schrieb Bernd Brodesser / Sascha Peters: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *urrks* ;-)
Wenn Du als erstes Argument mp3 hast, dann ersetzt die Shell *.$1 mit allen Dateien im aktuellen Verzeichnis, die nicht mit einem . anfangen und mit .mp3 enden. Ist das Argument hingegen wav, so werden alle Dateien im aktuellen Verzeichnis genommen, die nicht mit einem . beginnen und mit .wav enden.
Wie könnte man denn es so einrichten das man auch Dateinamen nimmt die mit einem Punkt anfangen?
ls *.$1 .*.$1 | while read datei; do
Ja, datei ist eine Variable. Nach read kommt immer der Bezeichner einer Variablen. ACHTUNG: Da darf kein $ vor. Bei der shell kommt bei der Auswertung einer Variablen ein $ vor den Namen, aber nur dort. Bei der Definition der Variablen darf kein $ stehen. Anstelle von datei kannst Du auch alles mögliche wählen, aber datei bietet sich hier an.
danke das leuchtet mir nun ein, also wird dort diese Variabele erst definiert desewegen habe ich das auch nicht verstanden!
Wenn Du das (für Dich zum Lesen des Scripts) deutlicher machen willst, kannst Du die Variable vorher deklarieren: datei= ls *.$1 .*.$1 | while read datei; do Das spielt aber für den Ablauf des Scripts keinerlei Rolle. Die Shell kann man nicht zwingen, nur Variablen zu benutzen, die vorher deklariert wurden und es gibt auch keine Datentypen in dem Sinne, dass man eine Variable explizit als numerisch / string ... definieren kann (AFAIK). Jan
On Don, 21 Jun 2001, Sascha Peters wrote:
Am Donnerstag, 21. Juni 2001 um 05:01 schrieb Bernd Brodesser / Sascha Peters:
* Sascha Peters schrieb am 20.Jun.2001:
Am Mittwoch, 20. Juni 2001 um 19:48 schrieb Jan Trippler / Sascha Peters: [..] Also man könnte den Script auch so schreiben das er WAV in MP3 schreibt, aber dann braucht man ja wieder ein anderes Programm als mpg123 und muß dann vorher abfragen welches Programm nun verwendet werden soll, alles machbar aber das brauche ich nicht.
,----[ ungetestet ] | MPG2WAV="mpg123" | WAV2MPG="notlame -V4 -m s" | | case "$1" in | *mp3) CONV="$MPG2WAV"; NEWEXT=".wav";; | *wav) CONV="$WAV2MPG"; NEWEXT=".mp3";; | *) echo "Don't know what to do" >/dev/stderr; exit 1;; | esac | | for datei in $(ls *.$1); do | $CONV "$datei" "$(basename $datei $1)${NEWEXT}" | done `---- -dnh P.S: Die id3-tags kann man dann z.B. mit dem tool 'id3' wunderbar per script nachtragen... -- Kaum wird man in dieser Gruppe mal ein bisschen Intelligent, schon sind alle verwirrt! [WoKo in dag°]
participants (4)
-
B.Brodesser@t-online.de
-
David Haller
-
Jan.Trippler@t-online.de
-
Sascha Peters