Em vez de usar find(que faz o trabalho bem), você também pode usar o shell para esse fim.
Digamos que você queira todos os arquivos de $ PWD a $ DEST. A tentativa natural seria:
mv $PWD/* $DEST
Como é que isso funciona? A expressão "$ PWD / *" se expande para os nomes de todos os arquivos nesse diretório. Esse recurso de shell é chamado de "globbing". O último argumento de mvé o diretório de destino. Se você tiver muitos arquivos, isso não funcionará porque o comprimento da linha de comando é limitado.
Mas a solução tem o problema de omitir arquivos de ponto - ou arquivos "ocultos", arquivos e diretórios cujo nome começa com um ".". Para resolver isso, você deve dizer ao seu shell para incluir arquivos de ponto ao globbing. Para fazer isso, use
shopt -s dotglob
ao usar bash(e você provavelmente usa, a bashmenos que tenha alterado o padrão). Nesse shell, o comando acima também funcionará para arquivos de ponto.
Como um aparte, em zsh, você tem a opção de escolher isso caso a caso. Para fazer isso, coloque
setopt extendedglob
no seu .zshrc. Então você pode usar
mv $PWD/*(D) $DEST
para mover todos os arquivos, incluindo arquivos de ponto. (O "D" tem o efeito de ativar temporariamente a opção "GLOB_DOTS").
Agora, a pergunta original era mover todos os arquivos regulares (não diretórios) de todos os subdiretórios e seus subdiretórios para um único diretório. Isso pode ser realizado com zsh:
mv $PWD/**/*(D.)
Aqui, a expressão **/*faz o globber descer recursivamente para subdiretórios. Os Dmeios "também selecionam arquivos de ponto"; os .meios "somente selecionam arquivos regulares, não diretórios".