在Bash脚本中获取当前目录名称(没有完整path)
我怎样才能得到一个bash脚本中的当前工作目录名称,甚至更好,只是一个terminal命令。
pwd
给出了当前工作目录的完整path,例如/opt/local/bin
但是我只想要bin
不需要basename,特别是不需要运行pwd的子shell(它增加了额外的和昂贵的fork操作 )。 shell可以使用参数扩展在内部执行此操作:
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
程序。 为你的情况:
% basename "$PWD" bin
$ echo "${PWD##*/}"
您可以使用pwd和basename的组合。 例如
#!/bin/bash CURRENT=`pwd` BASENAME=`basename "$CURRENT"` echo "$BASENAME" exit;
grep怎么样:
pwd | grep -o '[^/]*$'
我喜欢所选的答案(查尔斯·达菲),但要小心,如果你在一个符号链接目录,你想要的目标目录的名称。 不幸的是,我不认为这可以在一个参数扩展expression式中完成,也许我错了。 这应该工作:
target_PWD=$(readlink -f .) echo ${target_PWD##*/}
要看到这个,一个实验:
cd foo ln -s . bar echo ${PWD##*/}
报“吧”
DIRNAME
要显示path的主目录(不会产生/ usr / bin / dirname的fork-exec):
echo ${target_PWD%/*}
这将例如变换foo / bar / baz – > foo / bar
echo "$PWD" | sed 's!.*/!!'
如果您使用的是Bourne shell或者${PWD##*/}
不可用。
这个线程太棒了! 这是一个更多的味道:
pwd | awk -F / '{print $NF}'
令人惊讶的是,没有人提到这个select只使用内置的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或更新版本上工作。
basename $(pwd)
要么
echo "$(basename $(pwd))"
我通常在sh脚本中使用这个
SCRIPTSRC=`readlink -f "$0" || echo "$0"` RUN_PATH=`dirname "${SCRIPTSRC}" || echo .` echo "Running from ${RUN_PATH}" ... cd ${RUN_PATH}/subfolder
你可以使用它来自动化的东西…
下面的grep用正则expression式也在工作,
>pwd | grep -o "\w*-*$"
很简单
pwd | xargs basename
find像我这样的骑师
find $PWD -maxdepth 0 -printf "%f\n"
我非常喜欢使用gbasename
,它是GNU coreutils的一部分。
以下命令将导致在bash脚本中打印当前的工作目录。
pushd . CURRENT_DIR="`cd $1; pwd`" popd echo $CURRENT_DIR
您可以使用basename实用工具从string中删除以/结尾的任何前缀(如果存在于string中),并将结果打印在标准输出中。
$basename <path-of-directory>
只要使用:
pwd | xargs basename
要么
basename "`pwd`"
我使用这个命令:
dirname "$0"