Odpowiedzi:
Brzmi to jak chcesz basename z tej dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
polecenie przyjmie, że znajduje się w bieżącym katalogu (aka „.”).
parentname="$(basename "$(dirname "$pwd")")"
PWD
muszą być wielkie litery. Spróbować parentname="$(basename "$(dirname "$PWD")")"
.
Możesz użyć pwd, aby uzyskać bieżący katalog roboczy, i użyć rozszerzenia parametrów, aby uniknąć rozrzucenia go do innej (pod) powłoki.
echo ${PWD##*/}
Edycja: sprawdzone źródło
${path##*/}
Myślę, że to rozwiązanie z mniejszymi zasobami:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
edycja: Przepraszamy, zagnieżdżone rozszerzenie nie jest możliwe w bash, ale działa w zsh. Wersja Bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
lub ścieżka_pliku = / plik`.
foofile
? Jeśli nie jest pełna, nie można ustalić ścieżki (być może foofile
istniejący plik to nie tylko „ciąg”).
W skrócie, w jednej linii:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Najbardziej podoba mi się odpowiedź Julian67, ale tutaj jest nieco rozszerzona wersja:
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"