Respostas:
Parece que você deseja o nome de base do dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
comando assumirá que está no diretório atual (também conhecido como ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
devem ser capitalizadas. Tente parentname="$(basename "$(dirname "$PWD")")"
.
Você pode usar o pwd para obter o diretório de trabalho atual e usar a expansão de parâmetros para evitar bifurcá-lo em outro (sub) shell.
echo ${PWD##*/}
Edit: fonte comprovada
${path##*/}
Eu acho que essa é uma solução com menos recursos:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
edit: Desculpe, a expansão aninhada não é possível no bash, mas funciona no zsh. Versão Bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
ou filepath = / file`.
foofile
? Se não for o caminho completo, não será possível saber (talvez se foofile
um arquivo existente não seja apenas uma "string").
No bash, em uma linha:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
Eu gosto da resposta de Julian67 acima, mas aqui está uma versão expandida:
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"