拡張子なしでファイル名を変更する方法

拡張子なしでファイル名を変更する方法

アプリケーションが理解できるように、プログラムで名前を変更する必要がある多くのファイルがあります。

形式は次のとおりです。 名前を変更するファイル

最後から最初の_まで切り、点(.)に置き換える必要があります。

ファイル名の長さやファイル名の_個数があらかじめわからないので、awk/sed/cutのアイデアはありますか?

答え1

for F in *_*; do echo mv -- "${F}" "${F%_*}.${F##*_}"; done

出力が正しいと思われる場合は、echo上記のコマンドを削除してください。

ヒントは${F%_*}最後のものを削除し_26${F##*_}最後のものより前のすべてを削除することです_。どのように機能するかを見るには、次のコマンドを試してください。これで、区切り記号は次のようになります:

echo "${PATH}"
echo "${PATH%:*}"
echo "${PATH##*:}"
echo "${PATH%:*}_${PATH##*:}"

答え2

使用sed

for file in *_*
do 
    echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done

echo満足のいくものを削除してください。

答え3

sed行末マーク()を使用して最後のブロックを置き換えることができます$

#/bin/bash
for file in *_* ; do
  #any alphanumeric string as suffix
  mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
  #alternatively numbers only as in given input sample
  mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done

AFAIK\{1,\}前のリストの「1つ以上」ビットはGNUですが、sedこの制限について100%確信することはできません。

関連情報