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

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

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

フォーマットは次のようになります: 名前を変更するファイル

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

ファイル名の長さやファイル名に含まれる _ の数については事前にわかりませんが、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

私の知る限り、\{1,\}前述のリストの「1 つ以上」の部分は GNU ですsedが、この制限については 100% 確信はありません。

関連情報