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! :-)
dirnamehá 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=.;; esacainda está no POSIX-y e soluciona o problema.
Para obter directorypathdo 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