Você pode fazer isso com um simples loop de shell:
for x in ./*_*_*_*; do mv -i "$x" "${x%_*}"; done
i.e. para cada arquivo cujo nome contenha pelo menos três sublinhados, renomeie o arquivo, retirando a peça começando no último sublinhado.
Se houver uma colisão (por exemplo, 20150512_101129_3016_v1A
e 20150512_101129_3016_v1B
), o primeiro arquivo em ordem lexicográfica será renomeado para o destino desejado e o segundo será movido para um subdiretório, ou seja, 20150512_101129_3016_v1B
será movido para 20150512_101129_3016/20150512_101129_3016_v1B
após 20150512_101129_3016_v1A
ter sido renomeado para 20150512_101129_3016
. Para evitar isso, adicione uma verificação extra:
for x in ./*_*_*_*; do
if [ -e "${x%_*}" ]; then
echo "Not renaming $x because ${x%_*} already exists"
continue
fi
mv "$x" "${x%_*}"
done
Como alternativa, no Linux, passe a opção -T
para mv
para fazer essa verificação.