Respostas:
dirname $file
é o que você está procurando
dirname "$file"
, em vez. Sem as aspas, isso se comportará mal se o nome do arquivo ou diretório tiver espaços.
dirname $file
irá produzir
stuff/backup
que é o oposto de basename
:
basename $file
produziria
file.zip
Usar ${file%/*}
como sugerido por Urvin / LuFFy é tecnicamente melhor, pois você não dependerá de um comando externo. Para obter o nome da base da mesma maneira que você poderia fazer ${file##*/}
. Não é necessário usar um comando externo, a menos que você precise.
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
Também seria totalmente compatível com POSIX dessa maneira. Espero que ajude! :-)
dirname
há uma vantagem sobre a abordagem interna (mais eficiente), e é se você não tiver certeza de que seu caminho está totalmente qualificado para começar. Se você tiver file=file.zip
, dirname "$file"
retornará .
, enquanto ${file%/*}
retornará file.zip
.
case $file in */*) dir=${file%/*};; *) dir=.;; esac
ainda está no POSIX-y e soluciona o problema.
Para obter directorypath
do filepath
:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Basta usar $ dirname /home/~username/stuff/backup/file.zip
Vai voltar /home/~username/stuff/backup/
dirname $file