ファイル名の点を変更して下線で置き換えて、拡張子を変更せずにそのままにするために使用したいbashスクリプトがあります(btw、私はCentos 6を使用しています)。以下の出力に示すように、置き換える必要がある点がある場合はスクリプトが機能しますが、唯一の点が拡張子の場合、スクリプトはファイルを無視するのではなくファイル名を変更しようとします。私がこの問題をどのようによりよく処理するかを指摘できる人はいますか?助けてくれてありがとう。
私の(間違った)スクリプト:
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
入力例:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
出力:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
ベストアンサー1
私はこのプログラムがあなたが望むことをすると信じています。テストしてみると、いくつかの興味深いケース(例:拡張がまったくない場合)で動作します。
#!/bin/bash
for fname in *; do
name="${fname%\.*}"
extension="${fname#$name}"
newname="${name//./_}"
newfname="$newname""$extension"
if [ "$fname" != "$newfname" ]; then
echo mv "$fname" "$newfname"
#mv "$fname" "$newfname"
fi
done
直面する主な問題は、拡張機能が目的##
のタスクを実行しないことです。私はいつもbashのシェルパラメータ拡張が一種の黒魔法だと思いました。マニュアルの説明は完全には明確ではなく、拡張機能がどのように機能するかについてのサポート例がありません。彼らはまた非常に不思議です。
sed
個人的には、私は好きな方法で名前を変更する小さなスクリプトを作成するか、またはperl
全体的な操作を実行する小さなスクリプトを作成します。答えた他の人もこのアプローチをとりました。
私が指摘したいもう一つのことは、引用を使用することです。私はシェルスクリプトで何かをするたびに、人々に引用するときに非常に注意してください。シェルスクリプトの問題の最大の原因は、シェルが解釈すべきではないことを解釈することです。そして引用規則は明らかではありません。私はこのシェルスクリプトに引用の問題がないと思います。