Der beste Weg, um eine Dateierweiterung aus einer Zeichenfolge zu entfernen?

7

Ich verwende also ein Skript, das ich erstellt habe, um Videos in das WebM-Format zu konvertieren. Ein bestimmtes Programm ruft das Skript auf und sendet %fden vollständigen, absoluten Dateinamen des Videos wie folgt:

converter.sh %f

wo %fhat zwei mögliche Erweiterungen, .avioder .mpg.

# /bin/bash
ffmpeg -i $1 `dirname $1``basename $1 avi`webm && rm $1

Es funktioniert derzeit einwandfrei, wenn es $1eine .aviDatei enthält , da basenamedie .aviErweiterung entfernt wird. Wenn stattdessen $1mit endet .mpg, ist das Ergebnis .mpgwebm.

Wie kann ich dieses Skript ändern, um diese beiden möglichen unterschiedlichen Formate empfangen zu können?


Fortsetzen: Wenn dies der Fall $1ist /somedir/video.avi, sollte das Skript Folgendes tun:

ffmpeg -i /somedir/video.avi /somedir/video.webm

Und wenn $1ist /somedir/video.mpg, sollte das Skript tun:

ffmpeg -i /somedir/video.mpg /somedir/video.webm

Ich weiß, dass dies für manche Leute dumm sein könnte, aber ich bin ein bisschen neu in der Bash.

Tomas
quelle

Antworten:

9

Sie können Substitutionsmechanismen verwenden, die von den meisten Shells bereitgestellt werden:

B=$(basename "$1"); D=$(dirname "$1");
ffmpeg -i "$1" "$D/${B%.*}.webm" && rm "$1"

In der Tat basenameund dirnamekönnte auch durch Substitutionen emuliert werden.

Hinweis: Das direkte .*Entfernen von Suffixen ist auf Pfaden wie nicht korrekt this.dir/file.

Stéphane Gimenez
quelle
1
Ich erlaubte mir, die Variable zu zitieren und Backquotes durch$(…)
Stéphane Gimenez
Ja, aber die Dateien würden benannt *.avi.webmoder *.mpg.webmweil basenamedie Erweiterung nicht entfernt wird, es sei denn, Sie geben sie danach an.
Tomas
Entschuldigung, meine erste Antwort war dumm! Bearbeitet und noch verbesserungsbedürftig.
Stéphane Gimenez
2
@Tomas: Ohne Anführungszeichen und falls Ihre Dateinamen Leerzeichen enthalten, werden sie in mehrere Pfade aufgeteilt.
Stéphane Gimenez
2
Warum Gebrauch dirname, basename. Und nicht direkt zu verwenden `ffmpeg -i "$ 1" "$ {. 1% *} webm" && rm "$ 1"
enzotib