Respuestas:
dirname $file
es lo que estas buscando
dirname "$file", más bien. Sin las comillas, esto se comportará mal si el nombre del archivo o directorio tiene espacios.
dirname $file
saldrá
stuff/backup
que es lo contrario de basename:
basename $file
saldría
file.zip
Usar lo ${file%/*}sugerido por Urvin / LuFFy es técnicamente mejor ya que no dependerá de un comando externo. Para obtener el nombre de base de la misma manera que podría hacerlo ${file##*/}. No es necesario utilizar un comando externo a menos que sea necesario.
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
De esta manera, también sería totalmente compatible con POSIX. ¡Espero eso ayude! :-)
dirnametiene una ventaja sobre el enfoque integrado (más eficiente), y es si no está seguro de que su camino esté completamente calificado para comenzar. Si tiene file=file.zip, dirname "$file"volverá ., mientras ${file%/*}que volverá file.zip.
case $file in */*) dir=${file%/*};; *) dir=.;; esacsigue siendo POSIX-y y resuelve el problema.
Para obtener directorypathde filepath:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Simplemente use $ dirname /home/~username/stuff/backup/file.zip
Volverá /home/~username/stuff/backup/
dirname $file