Angenommen , ich habe eine Datei /from/here/to/there.txt
, und will nur den letzten Teil seiner dirname bekommen to
statt /from/here/to
, was soll ich tun?
80
Sie können verwenden basename
, obwohl es keine Datei ist. Entfernen Sie den Dateinamen mit dirname
und verwenden Sie dann basename
, um das letzte Element der Zeichenfolge abzurufen:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
wenn ich ihn einstelle.Das Gegenteil von
dirname
istbasename
:basename "$(dirname "/from/here/to/there.txt")"
quelle
Verwenden von
bash
Zeichenfolgenfunktionen:$ s="/from/here/to/there.txt" $ s="${s%/*}" && echo "${s##*/}" to
quelle
Mit der Bash- Parametererweiterung können Sie Folgendes tun:
path="/from/here/to/there.txt" dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname) last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
Dies ist effizienter, da keine externen Befehle verwendet werden.
quelle
Pure BASH Weg:
s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}" to
quelle
.
. Funktioniert nicht, wenn das Verzeichnis einen Punkt hat.
. Halten Sie es einfach und verwenden Sie einen Schrägstrich/
als Trennzeichen.Ein
awk
Weg, dies zu tun, wäre:awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
Erläuterung:
-F'/'
setzt das Feldtrennzeichen auf "/"$(NF-1)
<<<
verwendet alles danach als Standardeingabe ( Wiki-Erklärung )quelle
Noch ein Weg
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
quelle
printf "%s\n" "${x[-2]}"
.Diese Frage ist so etwas wie DIESES .
Um dies zu lösen, können Sie Folgendes tun:
DirPath="/from/here/to/there.txt" DirPath="$(dirname $DirPath)" DirPath="$(basename $DirPath)" echo "$DirPath"
Wie mein Freund sagte, ist dies auch möglich:
basename `dirname "/from/here/to/there.txt"`
Um einen Teil Ihres Weges zu erreichen, können Sie Folgendes tun:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }' OR echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }' OR etc
quelle
Die Top-Antwort ist für die gestellte Frage absolut richtig. In einem allgemeineren Fall mit dem benötigten Verzeichnis in der Mitte eines langen Pfades führt dieser Ansatz zu einem schwer lesbaren Code. Zum Beispiel :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(dirname $dir)" dir="$(basename $dir)"
In diesem Fall kann man verwenden:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6 THIS
quelle