查找当前路径的深度
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
使用perl:
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)
如何编写 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
使用perl:
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)