Basename in einem Shell-Skript

Mr. Brooks

Lt. Commander
Registriert
Aug. 2011
Beiträge
1.441
Hi,

hab versucht 'basename' in einem Shell-Skript anzuwenden um bei der Ausgabedatei die Erweiterung der Inputdatei weg zu bekommen, z. B. wenn man mehrere Dateien über eine For-Schleife konvertiert

HTML:
ffmpeg -i $1 $1_new

Alle Versuche 'basename' irgendwie direkt zu '$1_new' dazuzuwurschteln schlugen fehl. Wie müsste ich hier prinzipiell vorgehen? Vorher eine Variable erstellen die dann beim Output eingefügt wird?

Wenn ich testweise das hier versuche

HTML:
ausgabe=basename test.mp3 .mp3
echo $ausgabe

versuche kommt

Code:
test.mp3: Befehl nicht gefunden

Nehme ich den ganzen Pfad zur Datei kommt

Code:
/pfad/zum/ordner/test.mp3: Keine Berechtigung

Ich steh hier gerade auf dem Schlauch wie ich vorgehen muss.
 
Die Shell hat eine eingebaute Funktion dafür, dann brauchst du keine Zweitprogramme:

Code:
Microserver:~/dat # l
total 8
drwxr-xr-x 2 root root 4096 Feb  3 13:26 ./
drwx------ 8 root root 4096 Feb  3 13:25 ../
-rw-r--r-- 1 root root    0 Feb  3 13:25 dat1.mp3
-rw-r--r-- 1 root root    0 Feb  3 13:25 dat2.mp3

Microserver:~/dat # for dat in dat1.mp3 dat2.mp3 ; do echo ${dat%%.mp3*}; done
dat1
dat2
 
OK, hab ich so zum Laufen gebracht.

Ich habe statt

Code:
${dat%%.mp3*}

Code:
${dat%%.*}

damit das ganze nicht nur bei mp3 läuft. Dennoch verstehe ich den Sinn von

Code:
%%.*

nicht. Wenn ich .* oder %% weglasse fügt er wieder die Erweiterung der Inputdatei mit an. Wenn ich beides weglasse kommt die Fehlermeldung

Falsche Variablenersetzung
 
Die Zeile

Code:
ausgabe=basename test.mp3 .mp3

sollte übrigens richtig heißen

Code:
ausgabe=$(basename test.mp3 .mp3)

Das ausgabe=$(befehl) speichert die Ausgabe des Befehls befehl in der Variable ausgabe.
 
Zurück
Oben