Shellskript soll Verzeichnisse rekursiv 'abarbeiten'

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Heather
Beiträge: 34
Registriert: 12.06.2005 23:05:53

Shellskript soll Verzeichnisse rekursiv 'abarbeiten'

Beitrag von Heather » 22.10.2006 01:06:23

Hallo,

ich habe ein kleines Shellskript, mit dem ich aus wav-Dateien mp3-Dateien erstelle. Dazu kopiere ich es immer in das Verzeichnis mit den wav-Dateien und führe es dort aus. Wie bekomme ich es hin, dass es auch alle Unterverzeichnisse berücksichtigt und die dort abgelegten wav-Dateien ebenfalls umwandelt und die mp3-Dateien in das gleiche Verzeichnis packt, in dem die dazugehörigen wav-Dateien liegen?

Hier ist das Skript:

Code: Alles auswählen

#!/bin/bash
for i in *.wav;
do
  NAME_MP3=`basename "$i" wav`;
  lame -h -V 0 -S "$i" "$NAME_MP3"mp3 &
  while [ $((`ps -C lame | wc -l` - 1 )) -ge 2 ]; do sleep 1; done;
done
while [ $((`ps -C lame | wc -l` - 1 )) -ge 1 ]; do sleep 1; done;
Danke und Gruß!
Heather
Zuletzt geändert von Heather am 22.10.2006 12:32:08, insgesamt 1-mal geändert.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 22.10.2006 09:09:13

Warum schmeißt du lame in den Hintergrund und wartest dann auf Ihn??

Hier ist der Code so gedacht, dass du das Skript IRGENDWO ausführen kannst, aber du als 1. Parameter den Pfad angeben musst von dem er loslaufen soll

PS: ist ungetestet.. kann also typische mini bugs enthalten..

Code: Alles auswählen

#!/bin/bash

if [ "$#" -ne "1" ]
then
  echo "Fehler: es muss ein Verzeichnis angegeben werden"
  exit 1
fi


for i in `find "$1" -name "*.wav"`;
do
  DIRNAME=`dirname "$I"`
  NAME_MP3=`basename "$i" wav`;
  lame -h -V 0 -S "${DIRNAME}/${i}" "${DIRNAME}/${NAME_MP3}mp3"
done
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Heather
Beiträge: 34
Registriert: 12.06.2005 23:05:53

Beitrag von Heather » 22.10.2006 12:26:57

Hallo,

vielen Dank für die Hilfe. Doch es stimmt, das Skript hat noch Bugs.

Erstes Problem: Es kommt nicht mit Leerzeichen inden Verzeichnis- und Dateinamen klar.
Zweites Problem: Auch ohne Leerzeichen in den Verzeichnis- und Dateinamen behauptet es:
Could not find ".//lvm/Daten/Dateien/wav/neu/jkr/hp6/cd1/jkr_hp6_001.wav".
Wegen mangelnder Skript-Kenntnisse bitte ich noch mal um Hilfe.

Danke + Gruß!
Heather

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 22.10.2006 14:08:25

Hier die korrigierte Fassung.. bitte kopiere es 1:1 !!!! in deine Datei..

Code: Alles auswählen

#!/bin/bash

if [ "$#" -ne "1" ]
then
  echo "Fehler: es muss ein Verzeichnis angegeben werden"
  exit 1
fi


for i in `find "$1" -name "*.wav"`;
do
  DIRNAME=`dirname "$i"`
  NAME_MP3=`basename "$i" wav`;
  lame -h -V 0 -S "${i}" "${DIRNAME}/${NAME_MP3}mp3"
done
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Heather
Beiträge: 34
Registriert: 12.06.2005 23:05:53

Beitrag von Heather » 24.10.2006 20:31:03

Hallo,

nochmals vielen Dank!

Doch da muss immer noch irgendwo ein Fehler sein. Ich habe es probiert, die Leerzeichen machen wohl weiterhin Probleme.

Ohne Leerzeichen klappt's. Mit Leerzeichen trennt das Skript an der Stelle. Hier mal die Ausgabe vom letzten Versuch:

./erstelle-mp3.sh /lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1

Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/102heisse".
Could not find "erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/103heisse".
Could not find "erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/104heisse".
Could not find "erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/105Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/106Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/107Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/108Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/109Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/110Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/111Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/112Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/113Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/114Heisse".
Could not find "Erde.wav".
Could not find "/lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/115Heisse".
Could not find "Erde.wav".
LAME version 3.96.1 (http://lame.sourceforge.net/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding /lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/101heisseerde.wav
to /lvm/Daten/Dateien/wav/neu/ps/Heisseerde/CD1/101heisseerde.mp3
Encoding as 44.1 kHz VBR(q=0) j-stereo MPEG-1 Layer III (ca. 5.7x) qval=2

Hm, was muss ich ändern?

Danke + Gruß!
Heather

Antworten