Comando Unix para copiar arquivos recursivamente

2

Eu preciso de um comando unix para o seguinte:

Estrutura de Diretórios

/project
    /images
        /products
            /cup.jpg
            /laptop.jpg
        /designs
            /alpha.jpg
            /beta.jpg
            /gamma.jpg
        /team
            /jeff.jpg
        /locations
            /new-york.jpg

Eu gostaria que um comando copiasse todos os arquivos * e não pastas para fora do diretório "images" recursivamente para algo como isto.

/assets
    /cup.jpg
    /laptop.jpg
    /alpha.jpg
    /beta.jpg
    /gamma.jpg
    /jeff.jpg
    /new-york.jpg       

Eu tentei isso, mas ele apenas copiou as pastas recursivamente cp -r ./project/images/* ./assets/

    
por ThomasReggi 23.04.2013 / 19:43

1 resposta

6

Isto executa o cp para cada arquivo, por isso pode ser visivelmente mais lento se houver muitos arquivos pequenos (mas não com imagens típicas):

find project -name \*.jpg -exec cp {} assets \;

Isso leva vários argumentos por vez:

find project -name \*.jpg -print0 | xargs -0 -I% cp % assets

Sem nomes de arquivos -0 que contenham aspas simples ou aspas duplas resultariam em um erro como xargs: unterminated quote .

Bash 4 suporta ** com shopt -s globstar :

cp project/**/*.jpg assets
    
por 23.04.2013 / 20:15

Tags