获取当前目录或文件夹名称(没有完整路径)

我如何在bash脚本中检索当前工作目录/文件夹名称,或者更好的是,只是一个终端命令。

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

865467 次浏览

使用#0程序。对于您的案例:

% basename "$PWD"bin

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

#!/bin/bash
CURRENT=`pwd`BASENAME=`basename "$CURRENT"`
echo "$BASENAME"
exit;

不需要basename,特别是不需要运行pwd(增加了一个额外的,昂贵的,分叉操作)的子shell;shell可以在内部使用参数展开执行此操作:

result=${PWD##*/}          # to assign to a variableresult=${result:-/}        # to correct for the case where PWD=/
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的extlob支持来工作,即使有多个尾随斜杠:

dirname=/path/to/somewhere//shopt -s extglob           # enable +(...) glob syntaxresult=${dirname%%+(/)}    # trim however many trailing slashes existresult=${result##*/}       # remove everything before the last / that still remainsresult=${result:-/}        # correct for dirname=/ caseprintf '%s\n' "$result"

或者,没有extglob

dirname="/path/to/somewhere//"result="${dirname%"${dirname##*[!/]}"}" # extglob-free multi-trailing-/ trimresult="${result##*/}"                  # remove everything before the last /result=${result:-/}                     # correct for dirname=/ case
$ echo "${PWD##*/}"

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

pushd .CURRENT_DIR="`cd $1; pwd`"popdecho $CURRENT_DIR

这个线程很棒!这里还有一个味道:

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

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

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

看到这一点,一个实验:

cd fooln -s . barecho ${PWD##*/}

报告“bar”

人名

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

echo ${target_PWD%/*}

这将例如转换foo/bar/baz->foo/bar

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

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

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

$basename <path-of-directory>
basename $(pwd)

echo "$(basename $(pwd))"

只需使用:

pwd | xargs basename

basename "`pwd`"

关于grep:

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

令人惊讶的是,没有人提到这个仅使用内置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 "$0" || echo "$0"`RUN_PATH=`dirname "${SCRIPTSRC}" || echo .`echo "Running from ${RUN_PATH}"...cd ${RUN_PATH}/subfolder

你可以用它来自动化…

下面的grep与regex也在工作,

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

对于像我这样的骑师来说:

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

我非常喜欢使用#0,它是GNU coreutils的一部分。

用途:

basename "$PWD"

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

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

IFS=

在IFS之后有一个空间。

如果您只想在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

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

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

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

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

在你的情况下,结果如预期:

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

只需运行以下命令行:

basename $(pwd)

如果您想复制该名称:

basename $(pwd) | xclip -selection clipboard

输入图片描述

basname示例的替代方案

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

pwd | ack -o "[^/]+$"

我的shell没有附带basename软件包,如果有办法的话,我倾向于避免下载软件包。