Dateiname ohne Erweiterung verarbeiten

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Dateiname ohne Erweiterung verarbeiten

Beitrag von Richard » 24.02.2018 09:07:07

Hallo,

ich habe hier einige Skripte für die Konvertierung von Audio, Video und Bildern die immer nach dem gleichen Prinzip mit einer For-Schleife aufgebaut sind

Code: Alles auswählen

for file in *.mp3 ; do
 fname=$(basename "$file" .mp3)
 ffmpeg -i "$file" "$fname"-neu.mp3
done
Mit 'basename' will ich verhindern, dass bei einem Input 'datei.mp3' der Output statt 'datei-neu.flac' 'datei.mp3-neu.flac' heißt. Das geht soweit ganz gut. Es soll aber bei allen Arten von Audio-, Video- und Bilddateien funktionieren. Ich habe diese Skripte in KDE-Service-Menüs gepackt und diese gelten für alle Multimediadateien. Ich müsste dann ja aber für jede Dateierweiterung ein eigenes Basename erstellen

Code: Alles auswählen

fname=$(basename "$file" .mp3) # im die MP3-Erweiterung zu entfernen
fname=$(basename "$file" .m4a) # im die M4A-Erweiterung zu entfernen
fname=$(basename "$file" .wav) # im die WAV-Erweiterung zu entfernen
...
Hat Basename eine allgemeine Möglichkeit das zu entfernen? Es gibt die Option '--suffix=.list', aber auch das ist nur ein Auflisten der Erweiterungen. Günstig wäre es alles im Dateinamen vom Ende an betrachtet bis zum 1. Punkt zu entfernen. Über Google habe ich für sed z. B. diese Möglichkeit gefunden

Code: Alles auswählen

basename /root/video.old.mp4 | sed 's/\.[^.]*$//'
die im Terminal erstmal funktioniert, nur weiß ich nicht wie ich die in die For-Schleife packe.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Dateiame ohne Erweiterung verarbeiten

Beitrag von rodney » 24.02.2018 14:54:27

Fuer die bash gibt die Parameter Expansion. In diesem Fall wuerde es so ausschauen:

Code: Alles auswählen

$ file="filename.with.ext"
$ echo ${file%.*} 
filename.with
Die dazugehoerige Seite aus dem empfehlenswerten "Bash Hackers Wiki": http://wiki.bash-hackers.org/syntax/pe# ... ng_removal

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateiame ohne Erweiterung verarbeiten

Beitrag von breakthewall » 24.02.2018 15:12:57

Das könnte man so umsetzen:

Code: Alles auswählen

for file in *; do
 # Prüft auf Multimedia-Formate und überspringt bei Misserfolg
 ffprobe "$file" > /dev/null || continue
 # Trennt den Dateinamen ab wie basename
 fname="$(printf '%s' ${file##*/})"
 # Eine erneute Parameter-Expansion die die letzte Dateierweiterung entfernt
 ffmpeg -i "$file" "${fname%.*}"-neu.mp3
done

Antworten