(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')