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 globstar
no 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 find
comando:
.
: 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 find
que é mais rápido se você tiver muitos arquivos, pois não precisará chamar um mv
processo separado para cada arquivo:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
O +
no final diz find
para chamar o comando em vários arquivos por vez. Como find
só podemos colocar os nomes dos arquivos no final da linha de comando e mv
precisamos 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-directory
e "$@"
os argumentos subsequentes provenientes de find
expansão de {}
).