it-swarm.com.de

Ruft den aktuellen Verzeichnisnamen (ohne vollständigen Pfad) in einem Bash-Skript ab

Wie bekomme ich nur den aktuellen Arbeitsverzeichnisnamen in einem Bash-Skript oder noch besser nur einen Terminalbefehl?.

pwd gibt den vollständigen Pfad des aktuellen Arbeitsverzeichnisses an, z. /opt/local/bin aber ich will nur bin

736
Derek Dahmer

Keine Notwendigkeit für basename und insbesondere keine Notwendigkeit für eine Subshell mit pwd (die fügt eine zusätzliche und teure Fork-Operation hinz ); Die Shell kann dies intern mit Parametererweiterung tun:

result=${PWD##*/}          # to assign to a variable

printf '%s\n' "${PWD##*/}" # to print to stdout
                           # ...more robust than echo for unusual names
                           #    (consider a directory named -e or -n)

printf '%q\n' "${PWD##*/}" # to print to stdout, quoted for use as Shell input
                           # ...useful to make hidden characters readable.

Beachten Sie, dass Sie möglicherweise alle abschließenden Schrägstriche entfernen müssen, wenn Sie diese Technik unter anderen Umständen anwenden (nicht PWD, sondern eine andere Variable, die einen Verzeichnisnamen enthält). Das Folgende verwendet bashs Extglob-Unterstützung , um auch mit mehreren abschließenden Schrägstrichen zu arbeiten:

dirname=/path/to/somewhere//
shopt -s extglob           # enable +(...) glob syntax
result=${dirname%%+(/)}    # trim however many trailing slashes exist
result=${result##*/}       # remove everything before the last / that still remains
printf '%s\n' "$result"

Alternativ ohne extglob:

dirname="/path/to/somewhere//"
result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trim
result="${result##*/}"                  # remove everything before the last /
999
Charles Duffy

Verwenden Sie das Programm basename . Für Ihren Fall:

% basename "$PWD"
bin
271
Arkady
$ echo "${PWD##*/}"

Für den Fall, dass Sie nicht mehr weiterkommen möchten

129
DigitalRoss

Sie können eine Kombination aus pwd und basename verwenden. Z.B.

#!/bin/bash

CURRENT=`pwd`
BASENAME=`basename "$CURRENT"`

echo "$BASENAME"

exit;
23
mbelos

Wie wäre es mit grep:

pwd | grep -o '[^/]*$'
15
Orange

Ich mag die ausgewählte Antwort (Charles Duffy), aber seien Sie vorsichtig, wenn Sie sich in einem verknüpften Verzeichnis befinden und den Namen des Zielverzeichnisses wünschen. Leider glaube ich nicht, dass dies mit einem einzelnen Parameter-Erweiterungsausdruck möglich ist, vielleicht irre ich mich. Das sollte funktionieren:

target_PWD=$(readlink -f .)
echo ${target_PWD##*/}

Um dies zu sehen, ein Experiment:

cd foo
ln -s . bar
echo ${PWD##*/}

meldet "bar"

DIRNAME

So zeigen Sie die führenden Verzeichnisse eines Pfades an (ohne einen Fork-Exec von/usr/bin/dirname):

echo ${target_PWD%/*}

Dies wird z.B. transformiere foo/bar/baz -> foo/bar

8
FDS
echo "$PWD" | sed 's!.*/!!'

Wenn Sie Bourne Shell verwenden oder ${PWD##*/} nicht verfügbar ist.

7
anomal

Dieser Thread ist großartig! Hier ist noch eine Geschmacksrichtung:

pwd | awk -F / '{print $NF}'
6
rodvlopes
basename $(pwd)

oder

echo "$(basename $(pwd))"
4
user3278975

Überraschenderweise erwähnte niemand diese Alternative, die nur eingebaute Bash-Befehle verwendet:

i="$IFS";IFS='/';set -f;p=($PWD);set +f;IFS="$i";echo "${p[-1]}"

Als zusätzlicher Bonus können Sie den Namen des übergeordneten Verzeichnisses leicht erhalten mit:

[ "${#p[@]}" -gt 1 ] && echo "${p[-2]}"

Diese funktionieren mit Bash 4.3-alpha oder neuer.

4
Arton Dorneles

ich benutze dies normalerweise in sh-Skripten

SCRIPTSRC=`readlink -f "$0" || echo "$0"`
RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`
echo "Running from ${RUN_PATH}"
...
cd ${RUN_PATH}/subfolder

sie können dies verwenden, um Dinge zu automatisieren ...

3
Dutch Glory

Für die Findjockeys da draußen wie ich:

find $PWD -maxdepth 0 -printf "%f\n"
2
user2208522

Unten grep mit Regex funktioniert auch,

>pwd | grep -o "\w*-*$"
1
Abhishek Gurjar
basename "$PWD"

ODER

IFS=/ 
var=($PWD)
echo ${var[-1]} 

Setzen Sie das interne Dateinamentrennzeichen (IFS) wieder in ein Leerzeichen.

IFS= 

Nach dem IFS = steht ein Leerzeichen.

1
FireInTheSky

Ich bevorzuge die Verwendung von gbasename , das Teil von GNU coreutils ist.

0
Steve Benner

Sie können das Dienstprogramm basename verwenden, mit dem alle Präfixe, die mit/enden, und das Suffix (falls in string vorhanden) aus string gelöscht und das Ergebnis in der Standardausgabe ausgegeben werden.

$basename <path-of-directory>
0
niks_4143

Benutz einfach:

pwd | xargs basename

oder

basename "`pwd`"
0
marcos