Parece que você quer o nome de base de o nome do dir:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
Eu quero apenas o nome do diretório pai para um arquivo.
Exemplo: quando eu tenho path=/a/b/c/d/file
, quero apenas d
e não /a/b/c/d
(que eu recebo de dirname $path
) como saída.
Existe alguma maneira sofisticada de fazer isso?
Parece que você quer o nome de base de o nome do dir:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
Você pode usar o pwd para obter o diretório de trabalho atual e usar a expansão de parâmetro para evitar bifurcá-lo em outra (sub) casca.
echo ${PWD##*/}
Editar: fonte comprovada
Acho que esta é 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 em zsh. Versão do Bash:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
No bash, em uma linha:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),,'
Eu gosto mais da resposta de Julian67, mas aqui está um pouco 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"