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! :-)
dirname
tiene 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=.;; esac
sigue siendo POSIX-y y resuelve el problema.
Para obtener directorypath
de 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