No Bash, se VAR="/home/me/mydir/file.c"
, como eu ganho "/home/me/mydir"
?
No Bash, se VAR="/home/me/mydir/file.c"
, como eu ganho "/home/me/mydir"
?
Respostas:
dirname
e basename
são as ferramentas que você procura para extrair componentes de caminho:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Eles não são internos comandos Bash mas eles são parte do padrão POSIX (ver dirname
, basename
) e assim deve estar disponível na grande maioria dos sistemas que serão correndo Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Para evitar dependência basename
edirname
Em uma nota relacionada, se você tiver apenas o nome do arquivo ou o caminho relativo, dirname
por si só não ajudará. Para mim, a resposta acabou sendo readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Você pode combinar os dois para obter apenas o diretório.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
para canonizar o nome dado recursivamente
Se você deseja que os arquivos de destino sejam um link simbólico, primeiro você pode verificá-lo e obter o arquivo original. A cláusula if abaixo pode ajudá-lo.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Eu estava brincando com isso e surgiu com uma alternativa.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
A parte que eu gostei é que foi fácil estender o backup da árvore:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home