変数を含むforループでは、ワイルドカードは拡張されません。

変数を含むforループでは、ワイルドカードは拡張されません。

次の命名構造を使用して複数のファイルを繰り返そうとします。apple_123.txt、、、orange_456.txtbanana_789.txt

数字でワイルドカードを試してみましたが、ワイルドカードは拡張されておらず、出力は次のようになりました:apple_*.txt

ワイルドカードを引用してみましたが、違いはありません。

私のループ:

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

答え1

二重引用符(または一重引用符)内ではファイルのグロービングは行われません。

次のように変更できます。

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

ファイルのグロービングは引用符の内側には発生しないため、少しトリッキーです。 Kusalanandaの提案のおかげで、setここでは組み込み関数を使用してファイルにグローブを実行し、それを位置引数に設定します。拡張操作を実行するために使用します。一致するファイルが複数ある場合は、renameユーティリティまたは他のネストされたループを使用してすべてのファイルで機能するようにこのスクリプトを変更できます。それ以外の場合は、最初の一致するファイルの名前のみが変更されます。

現在のバージョンでファイル.outがまだ存在しない場合、または一致するものが複数ある場合、このスクリプトは目的の方法で機能しません。拡張子のみを変更し、番号を保持したい場合は、シェルパラメータ拡張を使用して簡単に削除して.txtから.out

また、配列宣言にカンマを使用する必要はなく、要素はスペースで区切られます。ファイル名に実際にカンマ文字が含まれていない限り。

関連情報