copiar recursivamente pulando diretórios com nome específico

2

Eu tenho um diretório com ~ 100 Gb. Eu preciso copiar este diretório para outro lugar pulando pastas específicas (há muitos deles). O seguinte é um código errado para demonstrar minhas necessidades.

$ cp -r ~/directory_to_copy /path/to/copy --skip=foo --skip=bar

Existe um exemplo de resultado deste comando. A árvore de diretórios original é

~/directory_to_copy
  aaa
    foo
    doo
      bar
  bbb
    ccc
      ddd
        bar
      eee

Árvore copiada é

/path/to/copy/
  aaa
    doo
  bbb
    ccc
      ddd
      eee

Como escrever comandos para meus propósitos?

    
por Loom 05.08.2015 / 22:33

2 respostas

5

Você quer rsync :

rsync -va --exclude=foo --exclude=bar ~/directory_to_copy /path/to/copy 

--exclude é usado para excluir arquivos ou diretórios indesejados.

-v torna o rsync detalhado (opcional).

-a diz ao rsync para copiar recursivamente e preservar atributos de arquivo. Isso é opcional, mas, se você não usar -a , provavelmente usará -r para copiar recursivamente.

Para requisitos mais complexos, as opções excluir e incluir podem ser especificadas. É até possível alterar as configurações de exclusão / inclusão de um diretório para outro, especificando a opção -F e colocando os arquivos .rsync-filter em vários locais na hierarquia de diretórios de origem. man rsync tem detalhes.

    
por 05.08.2015 / 22:52
0

você pode usar find para isso

find -depth ! -wholename '*foo*' ! -wholename '*bar*' -exec cp --parents '{}' /target/dir/ \;

observe que você a) precisará de -depth para ter certeza de encontrar os diretórios que precisam ser omitidos eb) usar a opção --parents para cp para criar o caminho completo durante a cópia.

Isso, no entanto, também irá pular as pastas vazias, pois -r em cp não pode ser usado, então TODOS os arquivos serão copiados quando a pesquisa chegar a ./firstDIR.

    
por 06.08.2015 / 10:19