答案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,\}
前面列表中的“一个或多个”位是 GNU sed
- 但我不能 100% 确定这个限制。