Antworten:
Es hört sich so an, als ob Sie den Basisnamen des Verzeichnisses wollen:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirnameBefehl davon aus, dass er sich im aktuellen Verzeichnis befindet (auch bekannt als ".").
parentname="$(basename "$(dirname "$pwd")")"
PWDmüssen großgeschrieben werden. Versuchen Sie es parentname="$(basename "$(dirname "$PWD")")".
Sie können pwd verwenden, um das aktuelle Arbeitsverzeichnis abzurufen, und die Parametererweiterung verwenden , um zu vermeiden, dass es in eine andere (Unter-) Shell eingebunden wird.
echo ${PWD##*/}
Edit: Bewährte Quelle
${path##*/}
Ich halte dies für eine ressourcenschonende Lösung:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
bearbeiten: Sorry, geschachtelte Erweiterung ist in Bash nicht möglich, aber es funktioniert in Zsh. Bash-Version:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=fileoder filepath = / file`.
foofile? Ob es nicht der vollständige Pfad ist, kann ich nicht wissen (vielleicht foofilehandelt es sich bei einer vorhandenen Datei nicht nur um eine "Zeichenfolge").
In Bash, in einer Zeile:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Die Antwort von Julian67 gefällt mir am besten, aber hier ist eine etwas erweiterte Version:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"