
答え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% 確信はありません。