基本上,我想编写一个 bash 脚本或函数,在给定输入的情况下a/b/c/d
,它将返回每个路径组件在开头和结尾都有通配符的所有匹配项,例如*a*/*b*/*c*/*d*
. 将波浪号 (~) 也视为主文件夹会很好。
有没有一种简单的方法可以在 bash 中执行此操作,还是我需要在 Python 之类的东西中执行此操作?
基本上,我想编写一个 bash 脚本或函数,在给定输入的情况下a/b/c/d
,它将返回每个路径组件在开头和结尾都有通配符的所有匹配项,例如*a*/*b*/*c*/*d*
. 将波浪号 (~) 也视为主文件夹会很好。
有没有一种简单的方法可以在 bash 中执行此操作,还是我需要在 Python 之类的东西中执行此操作?
我给你一个起点:
x="a/b/c/d"
x="*${x//\//*\/*}*"
echo $x
# output: "*a*/*b*/*c*/*d*", or all matching paths (if any)
这个解决方案远非完美。具体来说,您必须解决以下问题:
x
可能包含特殊字符,如空格或*
字符。他们需要适当地逃脱。x
可能包含双斜杠。例如:x=a//b
。我想你希望它变成*a*/*b*
,不是*a*/**/*b*
。x
可能包含前导或尾随斜杠。例如:x=/a/b
或x=a/b/
。x
可能以波浪号开头。所有这些问题都可以通过if
语句和替换来解决。
另一种方法(需要更多代码,但可能更安全且不易出错)是使用循环解析和解释字符串,如下所示:
shopt -s nullglob
x="a/b/c/d"
IFS=/ read -a x <<< "$x"
# x is now an array in the form (a b c d)
result=(*"${x[0]}"*)
for c in "${x[@]:1}"
do
newresult=()
for r in "${result[@]}"
do
match=("$r"/*"$c"*)
[ "${#match[@]}" -gt 0 ] && \
newresult=("${newresult[@]}" "${match[@]}")
done
result=("${newresult[@]}")
done
echo "${result[@]}"
同样,这并不完美。问题包括:
这个解决方案很好,因为这些问题更容易处理,而且您不必担心特殊字符。