在bash中查找路径的***目录的最佳方法[重复]

Posted

技术标签:

【中文标题】在bash中查找路径的***目录的最佳方法[重复]【英文标题】:best way to find top-level directory for path in bash [duplicate] 【发布时间】:2019-05-26 12:59:30 【问题描述】:

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

我有一个可行的方法,但看起来很丑:

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

似乎有更好的方法,但是我见过的所有替代方法似乎都更糟。

感谢您的任何建议!

【问题讨论】:

我更新为前缀为“/” 对于cut,您可以使用-f-2 是的,在这种情况下,基本目录可能是一个更好的术语。更新 【参考方案1】:

一个选项是使用awk

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

/go

【讨论】:

谢谢,我认为这既简短又易读。绝对比我的解决方案好【参考方案2】:

这是一个 sed 的可能性。还是丑。处理像////////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 的解决方案肯定看起来更具可读性。

【讨论】:

【参考方案3】:

不确定更好,但sed

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

【讨论】:

【参考方案4】:

这是一个函数中的 bash、sed 和 tr:

#!/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'

问候!

【讨论】:

你是对的。编辑【参考方案5】:

作为一种本机 bash 方法,不分叉子外壳,也不调用其他程序(因此,编写以最大限度地减少开销),它在极端情况下正常工作包括带有换行符的目录:

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" 将扩展为结果。

【讨论】:

以上是关于在bash中查找路径的***目录的最佳方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Bash - 使用查找命令排除子目录[重复]

JavaScript:查找值是不是在数组中的对象内的最佳方法[重复]

在 UNIX 文件系统中查找数值的最佳方法 [重复]

typescript 插入前在数组中查找重复的最佳方法

确定执行 BASH 脚本的路径 [重复]

忽略查找中的目录路径(在shell中)[重复]