找到当前路径的深度

时间:2018-02-15 21:45:15

标签: linux bash shell unix fish

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

假设我在:

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

它应该返回6.

7 个答案:

答案 0 :(得分:5)

使用shell参数扩展,没有外部命令:

$ var=${PWD//[!\/]}
$ echo ${#var}
6

第一个扩展会移除所有不是/的字符;第二个打印var的长度。

有关POSIX shell或Bash支持的详细说明(括号中的链接转到POSIX标准或Bash手册中的相应部分):

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

答案 1 :(得分:5)

鱼的简单方法:

count (string split / $PWD)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

假设你没有跟踪" /",你可以算上" /"。

所以你会

  • 删除所有不是" /"

  • 的内容
  • 计算结果字符串的长度

在鱼类中,这可以通过类似

的方式完成
string replace --regex --all '[^/]' '' -- $PWD | string length

正则表达式 - [^/]匹配每个不是" /"的字符。使用" - all",这将尽可能频繁地完成,并将其替换为'',即没有。

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

$PWD是当前目录。

string length只输出其输入的长度。

答案 4 :(得分:1)

您可以使用管道执行此操作。使用-o选项将字符串输入grep。这打印出每个" /"在一条新线上。管道再次进入wc -l计算打印的行数。

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

答案 5 :(得分:0)

使用

echo '/home/user/test/test1/test2/test3' | 
perl -lne '@_ = split /\//; print scalar @_ -1'

输出

6

答案 6 :(得分:0)

您可以像这样使用find

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

也许不是最有效的,但处理斜杠很好。