Wildcards

萬用字元不會在帶有變數的 for 循環中展開

  • September 21, 2020

我正在嘗試使用此命名結構遍歷多個文件:apple_123.txt, orange_456.txt,banana_789.txt

我正在嘗試對數字使用萬用字元,但未擴展萬用字元,輸出如下所示:apple_*.txt

我試過引用萬用字元,但沒有任何區別。

我的循環:

fruit=(apple, orange, banana)
for f in "${fruit[@]}"
do
       echo "mv ${f}_*.txt ${f}_*.out"
done

文件通配不在雙引號(或單引號)內執行。

您可以將其更改為:

fruit=(apple orange banana)
for f in "${fruit[@]}"
do
       set -- "${s}_"*.txt
       mv "$1" "${1%.txt}.out"
done

由於文件通配不會發生在引號內,這有點棘手,感謝 Kusalananda 的建議,我在set這裡使用內置函式對文件執行通配並將其設置為位置參數,然後我們可以使用它來執行擴展操作。如果可能存在多個匹配文件,則可以使用rename實用程序或另一個嵌套循環修改此腳本以對所有文件進行操作,否則只會重命名第一個匹配項。

在您目前的版本中,如果該.out文件尚不存在或有多個匹配項,則此腳本將無法按您希望的方式執行。如果您只是想更改副檔名但保留數字,則可以使用 shell 參數擴展來簡單地剝離.txt然後添加.out.

此外,無需在數組聲明中使用逗號,元素將被空格分隔。那是除非您的文件名實際上包含文字逗號字元。

引用自:https://unix.stackexchange.com/questions/610564