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

时间:2014-07-08 12:27:04

标签: bash path directory dirname

我的剧本:

    #!/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 /"。

提前致谢! :)

7 个答案:

答案 0 :(得分:17)

我找到了解决方案:

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

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

    #home#

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

答案 1 :(得分:6)

如果PATH总是有绝对形式,你可以做

这样的技巧
ROOT=${PATH#/} ROOT=/${ROOT%%/*}

或者

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

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

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

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

您也可以参考我的函数getabspath

答案 2 :(得分:3)

你可以尝试这个awk命令:

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

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

rm -rf ./"$basedirectory"/

答案 3 :(得分:1)

获得第一个火药:

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

答案 4 :(得分:0)

纯bash:

if(arg!=null && arg.length==2){
    if( (arg[0].equals("10") || arg[0].equals("20") || arg[0].equals("30"))
       && (arg[1].equals("2") || arg[1].equals("4") || arg[1].equals("6")) ) {
         Number data = new Number(arg[0], arg[1]);
    }
    else{
        //Handle wrong input(s)
    }
}
else{
    //Handle wrong input(s)
}

易于调整正则表达式。

答案 5 :(得分:0)

您可以使用dirname ...

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

输出以下内容...

/home/user/example/foo

答案 6 :(得分:0)

获取 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,但您可以通过进一步分解字符串来处理此类情况。