Como você pode mover (ou copiar) todos os arquivos de um determinado tipo para um diretório no Unix?

20

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)?

    
por qodeninja 02.02.2012 / 22:27

4 respostas

18
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
    
por 02.02.2012 / 22:43
15

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 {} ).

    
por 03.02.2012 / 00:49
4

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 {} +
    
por 03.02.2012 / 10:31
2

você também pode usar o find sem co -exec‍ :

mkdir /path/to/dest    
cp 'find /path/to/source -name "*.jar"' /path/to/dest
    
por 16.04.2015 / 16:24