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 bash
menos 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 D
meios "também selecionam arquivos de ponto"; os .
meios "somente selecionam arquivos regulares, não diretórios".