mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
Ainda não estou muito familiarizado com todos os truques de grep/find/awk/xargs
.
Eu tenho alguns arquivos correspondentes a um padrão específico, digamos *.xxx
. Esses arquivos estão em lugares aleatórios em um determinado diretório. Como posso encontrar todos esses arquivos e movê-los para uma pasta no meu diretório pessoal no Unix (que talvez ainda não exista)?
Se você quiser mover todos os arquivos dentro de uma hierarquia de diretórios para um único diretório de destino, em bash ≥4 (coloque shopt -s globstar
em seu ~/.bashrc
) ou zsh:
mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
Em outros shells:
mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
Como ler este comando find
:
.
: atravessar o diretório atual -name '*.xxx'
: atua nos arquivos cujo nome corresponde a esse padrão -exec … \;
: execute este comando em cada arquivo, substituindo {}
pelo caminho do arquivo Há um comando mais complexo usando find
que é mais rápido se você tiver muitos arquivos, pois não precisa invocar um processo mv
separado para cada arquivo:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
O +
no final informa find
para invocar o comando em vários arquivos por vez. Como find
só pode colocar os nomes dos arquivos no final da linha de comando, e mv
precisa 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 "$@"
são os argumentos subseqüentes provenientes da expansão find
de {}
).
Se você quiser replicar a estrutura de diretórios dos arquivos fonte correspondentes para o novo diretório de destino, você pode fazer uso da opção - pais do GNU cp:
mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +
você também pode usar o find sem co -exec
:
mkdir /path/to/dest
cp 'find /path/to/source -name "*.jar"' /path/to/dest