Copie todos os arquivos e pastas excluindo arquivos e pastas do subversion no OS X

14

Estou tentando copiar todos os arquivos e pastas de um diretório para outro, mas excluir determinados arquivos. Especificamente, desejo excluir arquivos e pastas do subversion. No entanto, eu gostaria de uma solução geral ainda concisa.

Eu imagino que vou encontrar a necessidade de excluir vários tipos de arquivos no futuro próximo. Por exemplo, eu poderia querer excluir .svn, * .bak e * .prj.

Aqui está o que eu juntei, mas não está funcionando para mim. A primeira parte, encontrar funciona, mas estou fazendo algo errado com xargs e cp . Eu tentei cp com e sem o -R . Além disso, estou usando o OS X e parece ter uma versão com menos recursos xargs do que os sistemas Linux.

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory
    
por Michael Prescott 28.09.2009 / 16:23

9 respostas

22

(Editado depois de reler a pergunta. O questionador diz que o rsync não está instalado)

Um possível problema com sua solução find / xargs é espaços nos nomes de arquivos. Para contornar isso, diga ao find e ao xargs para usar um caractere nulo (ASCII 0) para separar os arquivos encontrados:

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory

Se você achar que o rsync está disponível, ainda acho que o rsync é a melhor solução:

Use o rsync com a opção -C. Na página do manual do rsync :

This is a useful shorthand for excluding a broad range of files that you often don't want to transfer between systems. It uses a similar algorithm to CVS to determine if a file should be ignored.

Isso vai dizer ao rsync para ignorar esses padrões:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/

Por exemplo:

rsync -avC /path/to/source/directory /path/to/destination/directory

(note: Se você ainda não está familiarizado com o rsync, leia a man page sobre como o rsync lida com uma barra no caminho de origem. Ele se comporta de maneira diferente se você incluir a barra do que se não Pesquisar por 'barra final')

    
por 28.09.2009 / 17:03
2

Não são soluções gerais, mas ... você pode usar o comando svn export para criar uma cópia do espaço de trabalho sem as pastas de metadados .svn.

    
por 28.09.2009 / 16:29
2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

se você quiser, pode até colocar 'pv' ou algo parecido entre os processos do 2 tar.

    
por 28.09.2009 / 17:19
1

Eu iria fazer isso de uma maneira diferente, usando tar e seu mecanismo de exclusão.

No diretório de destino:

tar -X excludefile -C source -f - . | tar xf -

Isto irá cd para a fonte, distribuindo o conteúdo, excluindo o que está listado no excludefile, e então irá descompactá-lo no diretório atual.

    
por 28.09.2009 / 17:42
1

Uma maneira suja, mas rápida e concisa:

cp -r source destination
find destination -iname .svn |xargs rm -rf

Isso copia um diretório para outro (assim, a opção recursiva -r ) e, em seguida, apaga recursivamente qualquer nome com o nome .svn (ignorando o caso).

    
por 14.02.2013 / 22:35
0

Resposta editada : O problema é que -R torna sua cópia recursiva e você acaba copiando os arquivos ocultos. Aqui está o que eu usaria:

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

O sinal -mindepth 1 informa find para ignorar o diretório de nível superior. Como você deseja copiar todo o conteúdo desse diretório para um novo diretório de nível superior, presumo que não queira isso.

Como Chris Nava diz em sua resposta , já existe uma maneira interna de fazer isso se estamos falando de pastas SVN, mas desde que você pediu uma solução mais geral, isso pode ajudar um pouco.

    
por 28.09.2009 / 16:53
0

Suponho que isso depende do tamanho da sua árvore, mas por que não apenas copiar tudo primeiro, depois aparar as pastas .svn depois:

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?

    
por 28.09.2009 / 18:15
0

Não esqueça de grep -v

find . | grep -v .svn
    
por 28.09.2009 / 23:00
0

Você também pode fazer o oposto. Copie tudo e exclua as pastas .svn usando o comando abaixo:

find . | grep ".svn" | xargs rm -rf
    
por 19.05.2014 / 21:50