-1

基本上,我想编写一个 bash 脚本或函数,在给定输入的情况下a/b/c/d,它将返回每个路径组件在开头和结尾都有通配符的所有匹配项,例如*a*/*b*/*c*/*d*. 将波浪号 (~) 也视为主文件夹会很好。

有没有一种简单的方法可以在 bash 中执行此操作,还是我需要在 Python 之类的东西中执行此操作?

4

1 回答 1

2

我给你一个起点:

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/bx=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[@]}"

同样,这并不完美。问题包括:

  • 你必须处理双斜杠。
  • 您必须处理前导和尾随斜杠。
  • 您仍然必须处理波浪号。

这个解决方案很好,因为这些问题更容易处理,而且您不必担心特殊字符。

于 2016-01-08T16:41:07.017 回答