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! :-)
dirnameein 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=.;; esacist immer noch POSIX-y und behebt das Problem.
Um directorypathvon 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