Como posso acelerar um comando de cópia profunda seletiva no unix?

3

Eu sou (ab?) usando o comando unix 'find' para exportar recursivamente arquivos de uma árvore de diretórios que está repleta de diretórios .svn. Esse comando leva muito tempo para ser executado. Existe uma maneira mais rápida de realizar a mesma coisa?

find source/ -type f -and ! -path '*.svn*' -and -exec cp {} export \;

O que eu quero fazer é pesquisar cada subdiretório na árvore de diretórios que começa em source/ e copiar todos os arquivos desses diretórios para o diretório export , ignorando todos os arquivos que estão nos diretórios .svn

Atualização: (solução completa, baseada no responder postado por Michał Šrajer ):

find source/ -type f -and ! -path '*.svn*' -and -print0 | xargs -0 \
    cp --target-directory=export

Para quem está curioso: xargs na Wikipedia.

    
por e.James 12.10.2011 / 21:09

2 respostas

2

Se você não pode usar rsync como jhcaiced respondeu (+1), você pode fazer isso de várias maneiras:

  1. copie o diretório com um cp -r e remova todos os diretórios .svn usando find . -name .svn -delete '
  2. canalize um tar c para outro tar x . Alcatrão tem --exclude=

Você também pode otimizar seu código. Note que você chama cp para cada arquivo. Isso leva muito tempo. Você pode usar -print0 e xargs -0 . Isso será muito mais rápido.

    
por 12.10.2011 / 21:59
2

Você pode evitar copiar os mesmos arquivos várias vezes usando o rsync, o comando seria algo como:

fonte / export / --exclude '* .svn' do rsync

Se você precisar também remover da exportação os arquivos removidos da fonte / então adicione o parâmetro --delete ao comando.

    
por 12.10.2011 / 21:37