Chcę uzyskać tylko nazwę katalogu nadrzędnego dla pliku.
Przykład: gdy mam path=/a/b/c/d/file
, chcę tylko, d
a nie /a/b/c/d
(z czego otrzymuję dirname $path
) jako wynik.
Czy jest jakiś wyrafinowany sposób to zrobić?
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.
Edycja: sprawdzone źródło
źródło
${path##*/}
Myślę, że to rozwiązanie z mniejszymi zasobami:
edycja: Przepraszamy, zagnieżdżone rozszerzenie nie jest możliwe w bash, ale działa w zsh. Wersja Bash:
źródło
filepath=file
lub ścieżka_pliku = / plik`.foofile
? Jeśli nie jest pełna, nie można ustalić ścieżki (być możefoofile
istniejący plik to nie tylko „ciąg”).W skrócie, w jednej linii:
źródło
Najbardziej podoba mi się odpowiedź Julian67, ale tutaj jest nieco rozszerzona wersja:
źródło