答え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%確信することはできません。