cp sempre copiará o (s) arquivo (s) no início do comando para o arquivo ou diretório no final do comando. A barra realmente não faz muito para os argumentos, a menos que o argumento seja um link simbólico para um diretório. Então, com a barra, ela será tratada como um diretório, enquanto a omissão da barra copiará o próprio link.
Supondo que você queira copiar recursivamente todos os subdiretórios em seus exemplos, faça o seguinte:
cp -r /home/src/somedir /dest
e
cp -r /home/src/somedir/* /dest
O primeiro obtém o diretório /home/src/somedir e copiará esse argumento, o próprio diretório e todo o seu conteúdo, para o último argumento, /dest . Ele criará o diretório somedir em /dest , se necessário, e o usará se já existir.
O segundo adiciona * ao final do primeiro argumento, que o shell expandirá para ser todo arquivo que não iniciar com . em /home/src/somedir e copiará todos esses arquivos e diretórios para /dest sem levar em conta o que já está lá (exceto alguns sinalizadores para cp farão com que seja solicitado a sobrescrever arquivos que terão o mesmo no destino que um arquivo existente).
Como os comentários para esta resposta apontaram, há problemas usando * para pegar todos os arquivos no diretório. Uma alternativa seria usar tar para fazer a cópia para você
tar -c -C /home/src/somedir . | tar -x -C /dest
isso criará um arquivo tar de somedir sem o caminho principal usando -C para alternar para esse diretório primeiro. Por padrão, tar imprimirá para stdout , que será canalizado para outro tar para extraí-lo primeiro para o diretório /dest desejado. Isso também preservará muitos atributos de arquivo, que cp também pode fazer.