Se você deseja mover todos os arquivos dentro de uma hierarquia de diretórios para um único diretório de destino, no bash ≥4 (coloque shopt -s globstarno seu ~/.bashrc) ou no zsh:
mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
Em outras conchas:
mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
Como ler este findcomando:
.: percorre o diretório atual
-name '*.xxx': agir em arquivos cujo nome corresponda a esse padrão
-exec … \;: execute este comando em cada arquivo, substituindo {}pelo caminho para o arquivo
Existe um comando mais complexo findque é mais rápido se você tiver muitos arquivos, pois não precisará chamar um mvprocesso separado para cada arquivo:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
O +no final diz findpara chamar o comando em vários arquivos por vez. Como findsó podemos colocar os nomes dos arquivos no final da linha de comando e mvprecisamos ter o diretório de destino por último, usamos um shell intermediário para reorganizar os argumentos ( "$0"é o primeiro argumento para o shell ~/new-directorye "$@"os argumentos subsequentes provenientes de findexpansão de {}).