a/b/c/d
基本的に、入力が与えられた場合、各パスコンポーネントの先頭と末尾にワイルドカードがあるすべての一致を返すbash スクリプトまたは関数を作成したいと思います*a*/*b*/*c*/*d*
。チルダ (~) もホーム フォルダとして尊重するとよいでしょう。
これを bash で行う簡単な方法はありますか、それとも Python などでこれを行う必要がありますか?
a/b/c/d
基本的に、入力が与えられた場合、各パスコンポーネントの先頭と末尾にワイルドカードがあるすべての一致を返すbash スクリプトまたは関数を作成したいと思います*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[@]}"
繰り返しますが、これは完璧ではありません。問題は次のとおりです。
これらの問題は扱いやすく、特殊文字についても心配する必要がないため、このソリューションは優れています。