Não é tão difícil. Se o arquivo de destino existir, você só precisará separar o arquivo no nome de base e na extensão e incrementar um contador até que o novo nome de arquivo não exista no diretório de destino.
source=dirA/file.ext
dest_dir=dirB
file=$(basename file.ext)
basename=${file%.*}
ext=${file##*.}
if [[ ! -e "$dest_dir/$basename.$ext" ]]; then
# file does not exist in the destination directory
mv "$source" "$dest_dir"
else
num=2
while [[ -e "$dest_dir/$basename$num.$ext" ]]; do
(( num++ ))
done
mv "$source" "$dest_dir/$basename$num.$ext"
fi