Получить текущее имя каталога (без полного пути) в Bash script

Как получить только текущее имя рабочего каталога в bash script, или даже лучше, просто команду терминала.

pwd дает полный путь к текущему рабочему каталогу, например. /opt/local/bin, но я хочу только bin

Ответ 1

Нет необходимости в базовом имени, и особенно нет необходимости в подоболочке, выполняющей pwd (которая добавляет дополнительную и дорогостоящую операцию fork); оболочка может сделать это внутренне, используя расширение параметра:

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.

Обратите внимание, что если вы применяете эту технику в других обстоятельствах (не PWD, а в какой-то другой переменной, содержащей имя каталога), вам может потребоваться обрезать любые завершающие слэши. Ниже используется поддержка ba extglob для работы даже с несколькими конечными слешами:

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"

В качестве альтернативы, без extglob:

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

Ответ 2

Используйте программу basename. Для вашего случая:

% basename "$PWD"
bin

Ответ 3

$ echo "${PWD##*/}"

Ответ 4

Вы можете использовать комбинацию pwd и basename. Например.

#!/bin/bash

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

echo "$BASENAME"

exit;

Ответ 5

Как насчет grep:

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

Ответ 6

Мне нравится выбранный ответ (Charles Duffy), но будьте осторожны, если вы находитесь в символическом каталоге, и вам нужно имя целевого каталога. К сожалению, я не думаю, что это можно сделать в одном выражении расширения параметра, возможно, я ошибаюсь. Это должно работать:

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

Чтобы увидеть это, эксперимент:

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

сообщает "bar"

DIRNAME

Чтобы показать ведущие каталоги пути (без возникновения fork-exec из /usr/bin/dirname ):

echo ${target_PWD%/*}

Это будет, например, transform foo/bar/baz → foo/bar

Ответ 7

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

Если вы используете оболочку Bourne или ${PWD##*/} недоступно.

Ответ 8

Эта тема замечательная! Вот еще один вкус:

pwd | awk -F / '{print $NF}'

Ответ 9

basename $(pwd)

или

echo "$(basename $(pwd))"

Ответ 10

Удивительно, но никто не упомянул об этой альтернативе, которая использует только встроенные команды bash:

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

В качестве добавленного бонуса вы можете легко получить имя родительского каталога:

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

Они будут работать на bash 4.3-alpha или новее.

Ответ 11

Я обычно использую это в сценариях sh

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

вы можете использовать это для автоматизации...

Ответ 12

Чтобы найти там жокеев вроде меня:

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

Ответ 13

Ниже grep с регулярным выражением также работает,

>pwd | grep -o "\w*-*$"

Ответ 14

очень просто

pwd | xargs basename

Ответ 15

basename "$PWD"

ИЛИ

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

Переведите внутренний разделитель имен файлов (IFS) обратно на пробел.

IFS= 

После IFS = один пробел.

Ответ 16

Вы можете использовать служебную программу basename, которая удаляет любой префикс, заканчивающийся в/и суффикс (если присутствует в строке) из строки, и печатает результат на стандартном выходе.

$basename <path-of-directory>

Ответ 17

Просто используйте:

pwd | xargs basename

или

basename "`pwd`"

Ответ 18

Я предпочитаю использовать gbasename, который является частью GNU coreutils.

Ответ 19

Если вы хотите видеть только текущий каталог в области приглашения bash, вы можете отредактировать файл .bashrc в ~. Измените \w на \W в строке:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '

Запустите source ~/.bashrc, и он отобразит только имя каталога в области приглашения.

Ref: https://superuser.com/questions/60555/show-only-current-directory-name-not-full-path-on-bash-prompt

Ответ 20

Следующие команды приведут к печати текущего рабочего каталога в bash script.

pushd .
CURRENT_DIR="`cd $1; pwd`"
popd
echo $CURRENT_DIR

Ответ 21

Я использую эту команду:

dirname "$0"