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.

Matt
quelle

Antworten:

202
dirname $file

ist das, wonach Sie suchen

Matthieu
quelle
+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
Matchew
quelle
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! :-)

MageParts
quelle
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}
Urvin Shah
quelle
1

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

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

Nishchay Sharma
quelle