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.