Linux: Copia todos os arquivos que correspondem ao padrão de dir e subdirs em um único diretório

25

Se eu quisesse copiar todos os arquivos *.so de src para dst , faria:

cp src/*.so dst

No entanto, quero copiar todos os arquivos *.so de src e seus subdiretórios em dst . Alguma pista?

    
por Albus Dumbledore 19.07.2011 / 15:54

5 respostas

29

Tente:

find src/ -type f | grep -i so$ | xargs -i cp {} dst
    
por 19.07.2011 / 16:02
13

Se você estiver usando o Bash, poderá ativar o globstar opção de shell para corresponder arquivos e diretórios recursivamente:

shopt -s globstar
cp src/**/*.so dst

Se você precisar encontrar arquivos cujos nomes comecem com . , e / ou arquivos em e sob diretórios cujos nomes começam com . , defina também a opção dotglob (por exemplo, com shopt -s dotglob ). Você pode definir os dois em um comando:

shopt -s globstar dotglob
    
por 19.07.2011 / 17:42
5

Eu tentei o comando sugerido por Mike:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

mas acabou despejando todos os arquivos no diretório dst com seus caminhos relativos perdidos.

Para manter os caminhos relativos, o comando precisa ser modificado para isso:

find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
    
por 20.08.2013 / 16:45
1

O grep pode ser substituído usando o -name do find:

find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
    
por 20.10.2016 / 17:13
1

Outra maneira de fazer isso é assim:

find src/ -type f -name "*.so" -exec cp {} dst/ \;
    
por 24.11.2017 / 13:45

Tags