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

use*_*991 14 directory bash path dirname

我的剧本:

    #!/usr/bin/env bash
    PATH=/home/user/example/foo/bar
    mkdir -p /tmp/backup$PATH
Run Code Online (Sandbox Code Playgroud)

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

    cd /tmp/backup
    rm -rf ./home/
    cd - > /dev/null
Run Code Online (Sandbox Code Playgroud)

如何像上面的示例一样始终检测第一个文件夹?"dirname $ PATH"只返回"/ home/user/example/foo /".

提前致谢!:)

use*_*991 21

我找到了一个解决方案:

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

这将始终返回第一个目录.在此示例中,它将返回以下内容:

    #home#
Run Code Online (Sandbox Code Playgroud)

感谢@condorwasabi对awk的想法!:)

  • 如果你的路径是相对的并且看起来像这样:`dir1/in/dir2`那么你应该将字段`-f1`而不是`-f2`作为目标 (6认同)

con*_*abi 7

你可以尝试这个 awk 命令:

 basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')
Run Code Online (Sandbox Code Playgroud)

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

rm -rf ./"$basedirectory"/
Run Code Online (Sandbox Code Playgroud)

  • 很高兴您找到了解决方案。无论如何,你是对的,我只是编辑了剧本。我不知道为什么我写了`{print $1}`,我在发布之前也测试过它。现在应该可以了。 (2认同)

kon*_*box 6

如果PATH总是有一个绝对形式你可以做的伎俩

ROOT=${PATH#/} ROOT=/${ROOT%%/*}
Run Code Online (Sandbox Code Playgroud)

要么

IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}
Run Code Online (Sandbox Code Playgroud)

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

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

ABS=$(readlink -m "$PATH")
Run Code Online (Sandbox Code Playgroud)

你也可以参考我的函数getabspath.