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

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

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

20 ответов


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

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.

использовать basename


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


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

#!/bin/bash

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

echo "$BASENAME"

exit;

Как насчет grep:

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

очень просто

pwd | xargs basename

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

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

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

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

отчеты "бар"

DIRNAME

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

echo ${target_PWD%/*}

Это будет, например, преобразование из Foo/бар/баз -> файл foo/бар


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

Если вы используете Bourne shell или ${PWD##*/} не имеется.


этот поток велик! Вот еще один аромат:

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

basename $(pwd)

или

echo "$(basename $(pwd))"

Удивительно, но никто не упомянул эту альтернативу, которая использует только встроенные команды 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 или новее.


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

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

вы можете использовать это, чтобы автоматизировать вещи ...


basename "$PWD"

или

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

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

IFS= 

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


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

$basename <path-of-directory>

просто использовать:

pwd | xargs basename

или

basename "`pwd`"

ниже grep с regex также работает,

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

для жокеев найти там, как я:

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

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


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

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

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

dirname ""