Como extrair certos arquivos de um diretório no shell?

0

Eu fiz um script de shell simples que pega um diretório de linha de comando e extrai todo o seu conteúdo para o diretório atual em que o script está sendo executado.

#!/bin/bash
cp -v -R $1/* . 

Eu quero estender isso, digamos que eu queira extrair todos os arquivos PNG no diretório A e SOMENTE os arquivos PNG.

Meu primeiro pensamento é procurar por todos os arquivos no diretório que terminam com .png e cat-lo, mas não tenho idéia de como copiar APENAS esses arquivos para o diretório.

    
por Orcka 18.09.2016 / 03:04

3 respostas

1

Ou

find "$1" -name '*.png' -exec cp -v -- {} ./ \;

ou (com GNU cp ) mais eficientemente

find "$1" -name '*.png' -exec cp -vt ./ -- {} +

ou se o seu shell suportar, você pode usar globbing - por exemplo, em bash

shopt -s globstar

cp -v -- "$1"/**/*.png ./
    
por 18.09.2016 / 03:38
1

Quando a cópia fica complicada, rsync costuma ser útil:

rsync -mva --include '*/' --include '*.png' --exclude '*' "$1/" .

Antes de executar isso de verdade, faça um dry-run (opção: -n ) para que você possa verificar se faz o que deseja:

rsync -nmva --include '*/' --include '*.png' --exclude '*' "$1/" .

Como funciona

  • -v (opcional) diz ao rsync para ser detalhado, para que você possa ver o que está acontecendo.

  • -a (opcional) diz ao rsync para preservar atributos.

  • --include '*/' diz ao rsync para incluir todos os diretórios

  • --include '*.png' diz ao rsync para incluir todos os arquivos com .png de sufixo.

  • --exclude '*' diz ao rsync para excluir todos os arquivos não correspondidos acima.

  • -m diz ao rsync para não copiar diretórios que estariam vazios no lado do recebimento.

Observe que as opções include / exclude precisam ser especificadas por ordem.

    
por 18.09.2016 / 03:36
0

Como você está aparentemente usando o bash, é possível usar o recurso de expansão de nome de arquivo globstar :

shopt -s globstar
cp **/*.png /some/destination

Cuidado com nomes de arquivos em colisão - apenas um sobreviverá à cópia!

    
por 18.09.2016 / 03:42

Tags