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?

user304822
quelle
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

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.

Garyjohn
quelle
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
13

Wenn Sie die Erweiterung kennen, können Sie den Basisnamen verwenden

$ basename /home/jsmith/base.wiki .wiki
base
Steven Penny
quelle
0

Einzeiler in Bash ohne Verwendung des Basisnamens :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
quelle