Verzeichnis aus Pfad extrahieren


122

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.

Antworten:


202
dirname $file

ist das, wonach Sie suchen


+1, schlag mich drauf. wäre schneller gewesen, wurde aber aufgefordert, mehr alsdirname $file
matchew

1
dirname "$file", lieber. Ohne die Anführungszeichen verhält sich dies schlecht, wenn der Datei- oder Verzeichnisname Leerzeichen enthält.
Charles Duffy

fml, die frage sollte absolutes dir aus datei extrahieren, wie mache ich das dirname ergibt relativen Pfad, denke ich
Alexander Mills

Es ist hervorragend, wie schwierig dies in einem Win-Batch-Skript zu erreichen ist - ein weiterer Grund, sie vermutlich nicht zu verwenden!
Bunkerdive

47
dirname $file

wird ausgegeben

stuff/backup

Das ist das Gegenteil von basename:

basename $file

würde ausgeben

file.zip

Ich dachte, Matt könnte es von dort aus herausfinden (Mann Dirname) :)
Matthieu

1
Ich denke wir sind alle Matt hier. Nur eine Vermutung. Aber ich habe nur versucht, meine Antwort von Ihrer zu unterscheiden. =)
Matchew

Ja, ich benutze auch häufig den Basisnamen, es ist sehr geschickt =) Aber ich konnte einfach nichts über die Rückgabe des Dateiverzeichnisses auf Google finden! Ich glaube, ich habe nicht die richtigen Worte gefunden. Hah, alle drei von uns Matt? : D
Matt

1
Fügen Sie die erforderlichen Anführungszeichen hinzu, um sicherzustellen, dass diese Befehle mit Namen funktionieren, die Leerzeichen (Glob-Zeichen usw.) enthalten.
Charles Duffy

3

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! :-)


1
Es gibt einen Fall, in dem 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.
Charles Duffy

1
... natürlich können Sie verzweigen: case $file in */*) dir=${file%/*};; *) dir=.;; esacist immer noch POSIX-y und behebt das Problem.
Charles Duffy

2

Um directorypathvon der filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Einfach benutzen $ dirname /home/~username/stuff/backup/file.zip

Es wird zurückkehren /home/~username/stuff/backup/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.