Wildcards
萬用字元不會在帶有變數的 for 循環中展開
我正在嘗試使用此命名結構遍歷多個文件:
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
.此外,無需在數組聲明中使用逗號,元素將被空格分隔。那是除非您的文件名實際上包含文字逗號字元。