Risposte:
dirname $file
è quello che stai cercando
dirname "$file", piuttosto. Senza le virgolette ciò si comporterà male se il nome del file o della directory ha spazi.
dirname $file
verrà prodotto
stuff/backup
che è l'opposto di basename:
basename $file
produrrebbe
file.zip
Usare ${file%/*}come suggerito da Urvin / LuFFy è tecnicamente migliore poiché non ti affidi a un comando esterno. Per ottenere il nome di base nello stesso modo in cui potresti fare ${file##*/}. Non è necessario utilizzare un comando esterno a meno che non sia necessario.
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
Sarebbe anche completamente conforme a POSIX in questo modo. Spero che sia d'aiuto! :-)
dirnameha un vantaggio rispetto all'approccio integrato (più efficiente), e questo è se non sei sicuro che il tuo percorso sia pienamente qualificato per iniziare. Se lo hai file=file.zip, dirname "$file"tornerà ., mentre ${file%/*}tornerà file.zip.
case $file in */*) dir=${file%/*};; *) dir=.;; esacè ancora POSIX-y e risolve il problema.
Per ottenere directorypathda filepath:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Basta usare $ dirname /home/~username/stuff/backup/file.zip
Tornerà /home/~username/stuff/backup/
dirname $file