Linux 查找当前路径的深度

Linux 查找当前路径的深度,linux,bash,shell,unix,fish,perl,Linux,Bash,Shell,Unix,Fish,Perl,如何编写shell脚本来查找当前路径的深度 假设我在: /home/user/test/test1/test2/test3 它应该返回6。假设没有尾随“/”,您可以只计算“/” 你会的 删除所有不是“/”的内容 计算结果字符串的长度 在fish中,这将通过以下方式完成 string replace --regex --all '[^/]' '' -- $PWD | string length 这里的正则表达式-[^/]匹配不是“/”的每个字符。使用“-all”,这将尽可能多地执行,并用”

如何编写shell脚本来查找当前路径的深度

假设我在:

/home/user/test/test1/test2/test3

它应该返回6。

假设没有尾随“/”,您可以只计算“/”

你会的

  • 删除所有不是“/”的内容

  • 计算结果字符串的长度

在fish中,这将通过以下方式完成

string replace --regex --all '[^/]' '' -- $PWD | string length
这里的正则表达式-
[^/]
匹配不是“/”的每个字符。使用“-all”,这将尽可能多地执行,并用
替换,即不执行任何操作

--
是选项分隔符,因此参数中的任何内容都不会被解释为选项(否则,如果参数以“-a”开头,则会出现问题)

$PWD
是当前目录


字符串长度
只输出其输入的长度。

您可以计算当前路径中的斜杠数:

pwd | awk -F"/" '{print NF-1}'

您可以使用管道来实现这一点。使用-o选项将字符串导入grep。这将在新行上打印每个“/”。管道再次进入wc-l计数打印的行数

echo "$path_str" | grep -o '/' - | wc -l
使用:

输出
您可以像这样使用
find

find / -printf "%d %p\n" 2>/dev/null | grep "$PWD$" | awk '{print $1}'

可能不是最有效的,但可以很好地处理斜杠。

使用shell参数扩展,无需外部命令:

$ var=${PWD//[!\/]}
$ echo ${#var}
6
第一次扩展将删除所有非
/
的字符;第二个打印
var
的长度


关于POSIX shell或Bash支持的详细说明(括号中的链接指向POSIX标准或Bash手册中的相应章节):

  • $PWD
    包含当前工作目录的路径。(/)
  • ${parameter/pattern/string}
    扩展将
    参数
    扩展中出现的第一个
    模式
    替换为
    字符串
    。()
    • 如果第一个斜杠加倍(如本例中所示),则替换所有出现的斜杠
    • 如果
      string
      为空,则
      pattern
      后的斜杠是可选的(如我们的例子)
  • 模式
    [!\/]
    是一个括号表达式,表示“斜杠以外的任何字符”。(/)
    • 斜杠必须转义,
      \/
      ,否则会被解释为结束模式
    • 作为括号表达式中的第一个字符对表达式求反:表达式中的字符以外的任何字符都与模式匹配。POSIX sh需要对
      的支持
      并表示使用
      ^
      的行为未定义;Bash同时支持
      ^
      。请注意,这不是正则表达式中的括号表达式,其中只有
      ^
      有效
  • ${#parameter}
    扩展到
    parameter
    的长度。(/)

一种简单的鱼类方法:

count (string split / $PWD)

提示:使用
stringsplit
count
为什么要用“bash”和“fish”来标记这个问题?这两个shell不支持相同的语法。你的问题太宽泛了。库蒂斯,谢谢你的参与。我在网上查过,甚至在bash中也找不到这样的脚本。考虑到鱼是新的,我没想到会有很多反应,所以我愿意得到一个bash脚本,并尝试自己转换它。那是我的理智。抱歉,如果这是错误的事情。我可以移除标签吗?我会检查的。好吧,现在你移除了标签。。。隐式地否定了特定于Bash的答案。Banjamin,我真的很感谢你的评论和建议的解决方案。我不知道从帖子中删除标签会有这样的效果。即使在bash中,也没有人问过如何解决深度问题,所以我恢复了标签,因为您的答案对于对bash感兴趣的人来说非常有价值。谢谢。你能解释一下吗?我不知道
在此上下文中+1为最简洁的方式:)也许你可以增加关于贝壳的精度this@GillesQuenot
作为外壳模式括号表达式中的否定字符,而
^
的behvaviour未定义;Bash同时支持
^
。我再补充一点,谢谢。如果我想在稍后检查的变量中包含计数。如何将输出的长度设置为数字(而不是字符串)?这样行吗?“set length string replace--regex--all'[^/]''--$PWD”之后,我可以执行“if test$length-lt 7”
string length
将其转换为一个数字,这样您就可以将其转换为一个变量,以后再使用它<代码>设置长度(字符串替换--regex--all'[^/]''''--$PWD |字符串长度);如果test$length-lt 7
,我喜欢它,因为它可以在像ash/dash这样的最小外壳中工作。不过,您应该引用
$path\u str
,否则,如果您的字符串包含全局字符,您可能会遇到令人不快的惊喜。顺便说一句,POSIX需要
$PWD
,所以您可以使用它。关于报价的要点很好。你能澄清POSIX需要$PWD吗?恐怕我还没有linux方面的丰富经验。您可以使用环境变量
$PWD
,而不是使用
$path\u str
,您必须为其分配当前路径。如果shell想要与POSIX兼容,POSIX是一种兼容标准,则必须存在该环境变量。
$ var=${PWD//[!\/]}
$ echo ${#var}
6
count (string split / $PWD)