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 ';'