代码之家  ›  专栏  ›  技术社区  ›  phil swenson

在bash[duplicate]中查找路径的顶级目录的最佳方法

  •  0
  • phil swenson  · 技术社区  · 7 年前

    我需要一个命令,该命令将返回bash中指定路径的顶级基本目录。

    echo "/go/src/github.myco.com/viper-ace/psn-router" | cut -d "/" -f 2 | xargs printf "/%s"
    

    似乎有更好的方法,但我看到的所有替代方案似乎都更糟。

    谢谢你的建议!

    5 回复  |  直到 7 年前
        1
  •  2
  •   Charles Duffy    7 年前

    包括 带换行符的目录:

    topdir() {
        local re='^(/+[^/]+)'
        [[ $1 =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
    }
    

    与这里的大多数其他解决方案一样,调用看起来像 outvar=$(topdir "$path")


    为了进一步减少开销,您可以传入目标变量名,而不是捕获标准输出:

    topdir() {
        local re='^(/+[^/]+)'
        [[ $1 =~ $re ]] && printf -v "$2" '%s' "${BASH_REMATCH[1]}"
    }
    

    …用作: topdir "$path" outvar ,之后 "$outvar" 将扩展到结果。

        2
  •  1
  •   anubhava    7 年前

    一种选择是使用 awk

    echo "/go/src/github.myco.com/viper-ace/psn-router" |
    awk -F/ '{print FS $2}'
    

    /go
    
        3
  •  0
  •   karakfa    7 年前

    不确定是否更好,但与 sed

    $ echo "/go/src/github.myco.com/viper-ace/psn-router" | sed -E 's_(/[^/]+).*_\1_'
    /go
    
        4
  •  0
  •   zzevannn    7 年前

    ////////home/path/to/dir . 还是会在新线上爆炸。

    $ echo "////home/path/to/dir" | sed 's!/*\([^/]*\).*!\1!g'
    /home
    

    $ cd 'testing '$'\n''this' 
    $ pwd
    /home/path/testing
    this
    $ pwd | sed 's!/*\([^/]*\).*!/\1!g'
    /home
    /this
    

    如果你知道你的目录通常会被命名,那么你和anubhava的解决方案显然更具可读性。

        5
  •  0
  •   Matias Barrios    7 年前

    #!/bin/bash
    
    
    
    
    function topdir(){
      dir=$( echo "$1" | tr '\n' '_' )
      echo "$dir" | sed -e 's#^\(/[^/]*\)\(.*\)$#\1#g'
    }
    
    
    
    topdir '/go/src/github.com/somedude/someapp'
    
    topdir '/home/somedude'
    
    topdir '/with spaces/more here/app.js'
    
    topdir '/with newline'$'\n''before/somedir/somefile.txt'
    

    当做!

    推荐文章