拡張子を変更せずにファイル名の点を下線に変更します。

拡張子を変更せずにファイル名の点を下線に変更します。

ファイル名の点を変更して下線で置き換えて、拡張子を変更せずにそのままにするために使用したい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全体的な操作を実行する小さなスクリプトを作成します。答えた他の人もこのアプローチをとりました。

私が指摘したいもう一つのことは、引用を使用することです。私はシェルスクリプトで何かをするたびに、人々に引用するときに非常に注意してください。シェルスクリプトの問題の最大の原因は、シェルが解釈すべきではないことを解釈することです。そして引用規則は明らかではありません。私はこのシェルスクリプトに引用の問題がないと思います。

おすすめ記事