Use rsync :
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Observe que usar source e source/ é diferente. Uma barra à direita significa copiar o conteúdo da pasta source em destination . Sem a barra final, isso significa copiar a origem da pasta em destination .
Como alternativa, se você tiver muitos diretórios (ou arquivos) para excluir, use --exclude-from=FILE , em que FILE é o nome de um arquivo que contém arquivos ou diretórios a serem excluídos.
--exclude também pode conter curingas, como --exclude=*/.svn*
copiado de: link
Se você quiser usar o cp em si:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Isso pressupõe que a estrutura do diretório de destino seja a mesma da fonte.
Copiado de: link