Você pode fazer isso com o GNU find e o GNU mv :
find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +
Basicamente, a maneira que funciona se esse find passar pela árvore de diretórios inteira e por cada arquivo ( -type f ) que não esteja no diretório de nível superior ( -mindepth 2 ), executará um mv para movê-lo para o diretório desejado ( -exec mv … + ). O argumento -t para mv permite especificar primeiro o diretório de destino, o que é necessário porque a forma + de -exec coloca todos os locais de origem no final do comando.
Como Stephane Chazelas aponta, o acima só funciona com ferramentas GNU (que são padrão no Linux, mas não na maioria dos outros sistemas). O seguinte é um pouco mais lento (porque invoca mv várias vezes), mas muito mais universal:
find /dir1 -mindepth 2 -type f -exec mv -i '{}' /dir1 ';'