Antworten:
dirname $file
ist das, wonach Sie suchen
dirname "$file"
, lieber. Ohne die Anführungszeichen verhält sich dies schlecht, wenn der Datei- oder Verzeichnisname Leerzeichen enthält.
dirname $file
wird ausgegeben
stuff/backup
Das ist das Gegenteil von basename
:
basename $file
würde ausgeben
file.zip
Die Verwendung ${file%/*}
wie von Urvin / LuFFy vorgeschlagen ist technisch besser, da Sie sich nicht auf einen externen Befehl verlassen müssen. Um den Basisnamen auf die gleiche Weise zu erhalten, wie Sie es tun könnten ${file##*/}
. Es ist nicht erforderlich, einen externen Befehl zu verwenden, es sei denn, Sie müssen.
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
Auf diese Weise wäre es auch vollständig POSIX-konform. Ich hoffe es hilft! :-)
dirname
ein Vorteil gegenüber dem (effizienteren) integrierten Ansatz besteht, und zwar dann, wenn Sie nicht sicher sind, ob Ihr Pfad zunächst vollständig qualifiziert ist. Wenn Sie haben file=file.zip
, dirname "$file"
wird zurückkehren .
, während ${file%/*}
wird zurückkehren file.zip
.
case $file in */*) dir=${file%/*};; *) dir=.;; esac
ist immer noch POSIX-y und behebt das Problem.
Um directorypath
von der filepath
:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
Einfach benutzen $ dirname /home/~username/stuff/backup/file.zip
Es wird zurückkehren /home/~username/stuff/backup/
dirname $file