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! :-)
dirname
ha 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 directorypath
da 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