En una terminal: cd
en el directorio en cuestión, y luego
for x in `ls -1 | sed -e 's/^\(.\).*/\1/' | sort -u`; do
mkdir $x && mv -i ${x}?* $x
done
Esto supone que ningún archivo tiene un nombre de un solo carácter antes de empezar. Si lo tienen, podrías apartarlos antes de ejecutar el procedimiento anterior:
mkdir singles && mv ? singles
y trasladarlos después a sus destinos correspondientes.
Editar: Consulte los comentarios más abajo para ver algunas advertencias. Si tiene problemas con líneas de comando demasiado largas, puede sustituir la segunda línea por
mkdir $x && find . -maxdepth 1 -name "${x}?*" -exec mv -i {} $x \;