In meinem Skript benötige ich das Verzeichnis der Datei, mit der ich arbeite. Zum Beispiel die Datei = "stuff / backup / file.zip" . Ich brauche einen Weg, um die Zeichenfolge " stuff / backup / " aus der Variablen zu erhalten $file
.
122
dirname $file
dirname "$file"
, lieber. Ohne die Anführungszeichen verhält sich dies schlecht, wenn der Datei- oder Verzeichnisname Leerzeichen enthält.wird ausgegeben
Das ist das Gegenteil von
basename
:würde ausgeben
quelle
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.Auf diese Weise wäre es auch vollständig POSIX-konform. Ich hoffe es hilft! :-)
quelle
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 habenfile=file.zip
,dirname "$file"
wird zurückkehren.
, während${file%/*}
wird zurückkehrenfile.zip
.case $file in */*) dir=${file%/*};; *) dir=.;; esac
ist immer noch POSIX-y und behebt das Problem.Um
directorypath
von derfilepath
:quelle
Einfach benutzen
$ dirname /home/~username/stuff/backup/file.zip
Es wird zurückkehren
/home/~username/stuff/backup/
quelle