首页 文章

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

提问于
浏览
667

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

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

19 回答

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

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

  • 911

    不需要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 /
    
  • 0

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

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

    为了看到这个,一个实验:

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

    报告“酒吧”

    DIRNAME

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

    echo ${target_PWD%/*}
    

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

  • 216

    我用这个命令:

    dirname "$0"

  • 118
    basename $(pwd)
    

    要么

    echo "$(basename $(pwd))"
    
  • 22

    下面用正则表达式grep也工作,

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

    我更喜欢使用gbasename,这是GNU coreutils的一部分 .

  • 0
    basename "$PWD"
    

    OR

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

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

    IFS=
    

    IFS =之后有一个空格 .

  • 0

    grep怎么样:

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

    我通常在sh脚本中使用它

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

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

  • 1

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

    % basename "$PWD"
    bin
    
  • 3

    您可以使用pwd和basename的组合 . 例如 .

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

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

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

    作为 added bonus ,您可以使用以下命令轻松获取父目录的名称:

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

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

  • -1

    只需使用:

    pwd | xargs basename
    

    要么

    basename "`pwd`"
    
  • 0

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

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

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

    $basename <path-of-directory>
    
  • 11

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

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

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

    pushd .
    CURRENT_DIR="`cd $1; pwd`"
    popd
    echo $CURRENT_DIR
    
  • 8
    $ echo "${PWD##*/}"
    

相关问题