HOWTO · Bash
Entfernen Sie die Dateierweiterung mit Bash
Das letzte Dateinamensuffix mit Bash entfernen, `basename` für ein bekanntes Suffix verwenden oder mit `cut` Textfelder anhand eines Trennzeichens auswählen.
Auf dieser Seite
Um die letzte Erweiterung aus einer Dateinamenszeichenfolge in Bash zu entfernen, verwenden Sie Parameterexpansion: name="${file%.*}". Das Muster %.* entfernt vom Ende aus den kürzesten Treffer aus einem Punkt und beliebigen folgenden Zeichen; vorherige Punkte bleiben daher erhalten. So wird nur eine Zeichenfolge geändert, keine Datei auf dem Datenträger umbenannt.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
file='annual.report.html'
name="${file%.*}"
printf '%s\n' "$name"
Eine Erweiterung mit Bash-Parameterexpansion entfernen
Parameterexpansion ist meist die einfachste Wahl, wenn der Dateiname bereits in einer Bash-Variablen steht. Dafür sind weder ein externes Kommando noch eine Pipeline nötig. Weisen Sie das Ergebnis einer neuen Variablen zu, wenn der ursprüngliche Wert erhalten bleiben soll, oder überschreiben Sie dieselbe Variable, wenn Sie den alten Wert nicht mehr benötigen. Setzen Sie Variablenexpansionen in Anführungszeichen, damit Leerzeichen und Platzhalterzeichen Teil der Dateinamenszeichenfolge bleiben.
Das Muster entfernt den letzten Punkt und alles, was darauf folgt. Auf annual.report.html angewendet ergibt es beispielsweise annual.report; notes bleibt unverändert, weil darin kein passender Punkt vorkommt. Ein Name, der mit einem Punkt beginnt, wie .profile, wird mit diesem Muster zu einer leeren Zeichenfolge. Behandeln Sie solche Namen daher gesondert, falls sie für Ihre Daten relevant sind. Die Regel arbeitet rein textuell und erkennt nicht, ob ein Suffix einem tatsächlichen Dateityp entspricht.
basename verwenden, wenn die Erweiterung bekannt ist
Verwenden Sie basename, wenn Sie das genaue zu entfernende Suffix kennen. Das zweite Argument ist ein Suffix, das nur entfernt wird, wenn es am Ende des Namens steht. So macht basename "$file" .html aus annual.report.html den Namen annual.report. Endet der Name auf .HTML oder ein anderes Suffix, stimmt .html nicht überein und bleibt erhalten. Durch die Anführungszeichen um die Variable bleiben auch Leerzeichen in der Eingabe geschützt.
basename ist ein externes Kommando und daher weniger direkt als Parameterexpansion, wenn der Wert bereits in einer Bash-Variablen steht. Es ist nützlich, wenn genau das Verhalten mit einem bekannten Suffix gefragt ist. Keine der beiden Varianten ändert die Datei auf dem Datenträger.
cut für Text mit Trennzeichen verwenden, nicht für allgemeine Dateinamenssuffixe
Das Kommando cut ist dafür gedacht, Felder aus Text auszuwählen, dessen Felder durch Trennzeichen getrennt sind. Mit cut -d '.' -f 1 wird jede Eingabezeile an Punkten aufgeteilt und nur das erste Feld ausgegeben. Das eignet sich für eine Liste, wenn die gewünschte Regel lautet: „Den Text vor dem ersten Punkt behalten.“ Es ist keine allgemeine Methode, um die letzte Dateinamenerweiterung zu entfernen: Aus annual.report.html wird annual; sowohl .report als auch .html gehen verloren.
Für eine Liste mit einem Dateinamen pro Zeile können Sie den Text an cut weiterleiten, zum Beispiel: printf '%s\n' "$file" | cut -d '.' -f 1. Die Option -d legt das Trennzeichen fest, und -f 1 wählt das erste Feld aus. Verwenden Sie cut, wenn die Eingabe nach einem Trennzeichen strukturiert ist und genau diese Feldauswahl gewünscht ist. Für das letzte Suffix ist stattdessen die Bash-Parameterexpansion vorzuziehen.
Dateinamen mit mehreren Punkten behandeln und eine Methode auswählen
Ein Dateiname mit mehreren Punkten macht den Unterschied deutlich. Bei archive.part.tar.gz entfernt ${file%.*} nur .gz und lässt archive.part.tar übrig; basename "$file" .gz erzielt dasselbe, wenn .gz das bekannte Suffix ist; cut -d '.' -f 1 behält nur archive. Wählen Sie Parameterexpansion für das letzte Suffix, basename für ein bekanntes Suffix und cut für ein durch Trennzeichen abgegrenztes Feld. Diese Beispiele ändern Dateinamenszeichenfolgen; zum Umbenennen eines Dateisystemeintrags ist ein separater Vorgang erforderlich.