次の命名構造を使用して複数のファイルを繰り返そうとします。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
答え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
。
また、配列宣言にカンマを使用する必要はなく、要素はスペースで区切られます。ファイル名に実際にカンマ文字が含まれていない限り。