在Bash脚本中获取当前目录名称(没有完整路径)

时间:2009-09-03 03:11:53

标签: bash shell

如何在bash脚本中获取当前工作目录名称,甚至更好,只需一个终端命令。

pwd给出了当前工作目录的完整路径,例如/opt/local/bin但我只想要bin

22 个答案:

答案 0 :(得分:966)

不需要basename,特别是不需要运行pwd的子shell(adds an extra, and expensive, fork operation); shell可以使用parameter expansion内部执行此操作:

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,而是包含目录名称的其他变量),则可能需要修剪任何尾部斜杠。下面使用bash的extglob support来处理多个尾部斜杠:

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 /

答案 1 :(得分:248)

使用basename程序。对于你的情况:

% basename "$PWD"
bin

答案 2 :(得分:127)

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

答案 3 :(得分:23)

您可以使用pwd和basename的组合。 E.g。

#!/bin/bash

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

echo "$BASENAME"

exit;

答案 4 :(得分:15)

grep如何:

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

答案 5 :(得分:8)

我喜欢选定的答案(Charles Duffy),但如果你在符号链接的目录中并且想要目标目录的名称,请小心。不幸的是我不认为它可以在单个参数扩展表达式中完成,也许我错了。这应该有效:

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

要看到这个,一个实验:

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

报告“bar”

DIRNAME

显示路径的前导目录(不会产生/ usr / bin / dirname的fork-exec):

echo ${target_PWD%/*}

这将是例如变换foo / bar / baz - >富/酒吧

答案 6 :(得分:7)

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

如果您使用的是Bourne shell,则${PWD##*/}不可用。

答案 7 :(得分:5)

这个帖子很棒!这是另一种味道:

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

答案 8 :(得分:4)

basename $(pwd)

echo "$(basename $(pwd))"

答案 9 :(得分:4)

令人惊讶的是,没有人提到仅使用内置bash命令的替代方案:

event["tag"] = ["_filter_error"]

作为额外奖励,您可以轻松获取父目录的名称:

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

这些将适用于Bash 4.3-alpha或更新版本。

答案 10 :(得分:3)

我通常在sh脚本中使用它

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

你可以用它来自动化......

答案 11 :(得分:2)

对于像我这样的发现骑师:

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

答案 12 :(得分:1)

basename "$PWD"

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

将内部文件名称分隔符(IFS)转回空格。

IFS= 

IFS =后有一个空格。

答案 13 :(得分:1)

如果只想在bash提示区域中看到当前目录,则可以在.bashrc中编辑~文件。将以下行中的\w更改为\W

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

运行source ~/.bashrc,它将仅在提示区域中显示目录名称。

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

答案 14 :(得分:1)

使用正则表达式的grep下面也正常,

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

答案 15 :(得分:0)

我特别喜欢Charles的方法,因为它避免了一个新的过程,有很多方法,但是在不知道这一点之前,我用awk解决了它

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

答案 16 :(得分:0)

只需删除任何字符直到 /(或 \,如果您使用的是 Windows)。由于匹配将变得贪婪,它将删除所有内容,直到最后一个 /:

pwd | sed 's/.*\///g'

在您的情况下,结果符合预期:

λ a='/opt/local/bin'

λ echo $a | sed 's/.*\///g'
bin

答案 17 :(得分:0)

我非常喜欢使用gbasename,这是GNU coreutils的一部分。

答案 18 :(得分:0)

只需使用:

pwd | xargs basename

basename "`pwd`"

答案 19 :(得分:0)

您可以使用basename实用程序从字符串中删除以/结尾的任何前缀(如果存在于字符串中),并打印 结果是标准输出。

$basename <path-of-directory>

答案 20 :(得分:-1)

以下命令将导致以bash脚本打印当前工作目录。

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

答案 21 :(得分:-6)

我使用这个命令:

dirname "$0"