如何在bash中获取给定路径的根目录



我的脚本:

    #!/usr/bin/env bash
    PATH=/home/user/example/foo/bar
    mkdir -p /tmp/backup$PATH

现在我想得到"$PATH"的第一个文件夹:/home/

    cd /tmp/backup
    rm -rf ./home/
    cd - > /dev/null

我怎么能像上面的例子一样总是检测到第一个文件夹?"dirname $PATH"只返回"/home/user/example/foo/".

提前感谢!:)

我找到了一个解决方案:

    #/usr/bin/env bash
    DIRECTORY="/home/user/example/foo/bar"
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
    echo "#$BASE_DIRECTORY#";

总是返回第一个目录。在这个例子中,它将返回以下内容:

    #home#

感谢@condorwasabi的awk创意!:)

您可以尝试以下awk命令:

 basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')

此时basedirectory将是字符串home然后你写:

rm -rf ./"$basedirectory"/

如果PATH总是有一个绝对的形式,你可以像

ROOT=${PATH#/} ROOT=/${ROOT%%/*}

IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}

然而,我也应该补充说,最好使用其他变量,而不是使用PATH,因为它会改变你的二进制文件的搜索目录,除非你真的打算。

也可以选择通过readlink -freadlink -m将路径转换为绝对形式:

ABS=$(readlink -m "$PATH")

你也可以参考我的函数getabspath

获取VAR的第一个目录组件:

echo ${VAR%${VAR#/*/}}

如果是VAR="/path/to/foo",返回/path/

解释:

${VAR#X}去掉前缀X并返回剩余部分。因此,如果VAR=/path/to/foo,则/*/匹配前缀/path/,并且表达式返回后缀to/foo

${VAR%X}去掉后缀X。通过插入${VAR#X}的输出,它去掉了后缀并返回前缀。

如果你能保证你的路径是正确的,这是一个方便的方法。对于某些路径,例如//path/to/foopath/to/foo,它不能很好地工作,但是您可以通过进一步分解字符串来处理这种情况。

获取第一个目录:

path=/home/user/example/foo/bar
mkdir -p "/tmp/backup$path"
cd /tmp/backup
arr=( */ )
echo "${arr[0]}"

PS:永远不要在脚本中使用PATH变量,因为它会覆盖默认的PATH,并且您的脚本将无法执行许多系统实用程序

编辑:也许这应该为您工作:

IFS=/ && set -- $path; echo "$2"
home

纯bash:

DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"

易于调整正则表达式

您可以使用dirname

#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(dirname "${DIRECTORY}")
echo "#$BASE_DIRECTORY#";

输出如下…

/home/user/example/foo

相关内容

  • 没有找到相关文章

最新更新