Ruft das übergeordnete Verzeichnis für eine Datei ab

23

Ich möchte nur den Namen des übergeordneten Verzeichnisses für eine Datei erhalten.

Beispiel: Wenn ich habe path=/a/b/c/d/file, möchte ich nur dund nicht /a/b/c/d(was ich von dirname $path) als Ausgabe.

Gibt es eine ausgefeilte Möglichkeit, dies zu tun?

Shraddha
quelle

Antworten:

26

Es hört sich so an, als ob Sie den Basisnamen des Verzeichnisses wollen:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
Gordon Davisson
quelle
warum empfange ich. anstelle des übergeordneten Verzeichnisses auf Debian?
Amir
@Amir: Beginnen Sie mit einem vollständigen Pfad oder nur einem Dateinamen? Wenn es sich nur um einen Dateinamen handelt, geht der dirnameBefehl davon aus, dass er sich im aktuellen Verzeichnis befindet (auch bekannt als ".").
Gordon Davisson
Nun, ich benutze dies:parentname="$(basename "$(dirname "$pwd")")"
Amir
1
@Amir: Shell-Variablen unterscheiden zwischen Groß- und Kleinschreibung und PWDmüssen großgeschrieben werden. Versuchen Sie es parentname="$(basename "$(dirname "$PWD")")".
Gordon Davisson
5

Sie können pwd verwenden, um das aktuelle Arbeitsverzeichnis abzurufen, und die Parametererweiterung verwenden , um zu vermeiden, dass es in eine andere (Unter-) Shell eingebunden wird.

echo ${PWD##*/}

Edit: Bewährte Quelle

Feuer
quelle
Die Frage hat nichts mit dem aktuellen Verzeichnis zu tun. Sie könnten${path##*/}
Matteo
1

Ich halte dies für eine ressourcenschonende Lösung:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

bearbeiten: Sorry, geschachtelte Erweiterung ist in Bash nicht möglich, aber es funktioniert in Zsh. Bash-Version:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d
Uzsolt
quelle
Es gibt einige Randfälle, die nicht gut behandelt werden können, vor allem, wenn kein vollständiger Pfad mit mehreren Ebenen vorhanden ist. Versuchen Sie es zum Beispiel mit filepath=fileoder filepath = / file`.
Gordon Davisson
Tatsächlich. Aber von was ist das Elternverzeichnis foofile? Ob es nicht der vollständige Pfad ist, kann ich nicht wissen (vielleicht foofilehandelt es sich bei einer vorhandenen Datei nicht nur um eine "Zeichenfolge").
Uzsolt
1

In Bash, in einer Zeile:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
julian67
quelle
2
Können Sie bitte die entsprechenden Abläufe erläutern? es kann zukünftigen Lesern helfen. Bitte versuchen Sie auch nicht, Antworten mit einer halben Zeile zu schreiben.
Lorenzo Von Matterhorn
0

Die Antwort von Julian67 gefällt mir am besten, aber hier ist eine etwas erweiterte Version:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"
Dominic van der Zypen
quelle