基本上,我想編寫一個bash腳本或函數,在給定輸入a/b/c/d
的情況下,它將返回所有匹配,其中每個路徑組件在開始和結束處具有通配符,例如, *a*/*b*/*c*/*d*
。將代字號(〜)作爲主文件夾也很好。基於a/b/c/d的輸入返回與* a */* b */* c */* d *匹配的Bash函數?
有沒有一種簡單的方法在bash中做到這一點,或者我需要在Python這樣的東西中做到這一點?
基本上,我想編寫一個bash腳本或函數,在給定輸入a/b/c/d
的情況下,它將返回所有匹配,其中每個路徑組件在開始和結束處具有通配符,例如, *a*/*b*/*c*/*d*
。將代字號(〜)作爲主文件夾也很好。基於a/b/c/d的輸入返回與* a */* b */* c */* d *匹配的Bash函數?
有沒有一種簡單的方法在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[@]}"
再次,這是不完善。問題包括:
這個解決方案很好,因爲這些問題更容易處理,您也不必擔心特殊字符。
在'echo $ x'中保留變量不加引號是這裏的關鍵。 –
其他一些例子會很有用。另外,我想,'〜'擴展功能將是一個麻煩。 –