Wie extrahiere ich den Dateinamen ohne die Erweiterung aus einem vollständigen Pfad?


10

Ich versuche, mein erstes Bash-Skript zu korrigieren, und irgendwann wird ein Dateiname an das Skript als übergeben $1. Ich muss den Dateinamen ohne die Erweiterung extrahieren.
Derzeit gehe ich davon aus, dass alle Erweiterungen aus drei Buchstaben bestehen. Daher entferne ich die letzten 4 Zeichen, um den Dateinamen zu erhalten:

a="${1:0:-4}"

Aber ich muss in der Lage sein, mit Erweiterungen zu arbeiten, die mehr als drei Zeichen haben, wie %~n1in Windows.
Gibt es eine Möglichkeit, den Dateinamen ohne die Erweiterung aus den Argumenten zu extrahieren?


Antworten:


27

Der übliche Weg, dies in Bash zu tun, ist die Parametererweiterung. (Siehe die Bash- Manpage und suchen Sie nach "Parametererweiterung".)

a=${1%.*}

Das %gibt an, dass alles, was mit dem folgenden Muster ( .*) von rechts übereinstimmt , unter Verwendung der kürzestmöglichen Übereinstimmung aus dem Parameter gelöscht werden soll $1. In diesem Fall benötigen Sie keine doppelten Anführungszeichen (") um den Ausdruck.


1
Die Dateimuster lauten im Allgemeinen wie folgt: "Something.eng.ext". In diesem Fall ist ext natürlich die Erweiterung, aber bei Verwendung von $ {1%. *} Wird nur der Teil "Something" zurückgegeben, oder?
user304822

2
Nr. ${1%.*}Wird zurückkehren Something.eng. Wenn Sie alles rechts von der ersten entfernen möchten, .einschließlich der ., verwenden Sie ${1%%.*}, die zurückgegeben wird Something.
Garyjohn


0

Einzeiler in Bash ohne Verwendung des Basisnamens :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.