查找当前路径的深度

Find the depth of the current path

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

假设我在:

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

应该return6.

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

所以你会

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

  • 计算结果字符串的长度

在鱼中,这可以通过类似

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

此处的正则表达式 - [^/] 匹配每个不是“/”的字符。使用“--all”,这将尽可能频繁地完成,并将其替换为 '',即什么都不做。

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

$PWD为当前目录。

string length 简单地输出其输入的长度。

您可以数一数当前路径中斜线的数量:

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

您可以使用管道执行此操作。使用 -o 选项将字符串通过管道传输到 grep 中。这将在新行上打印出每个“/”。再次通过管道输入 wc -l 计算打印的行数。

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

使用

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

输出

6

你可以像那样使用 find :

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

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

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

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

第一次扩展删除所有不是/的字符;第二个打印 var.

的长度

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

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

鱼的简单方法:

count (string split / $PWD)