Quando o último argumento para cp é um diretório existente, cp copia o (s) arquivo (s) de origem para esse diretório. mv faz o mesmo.
Você gostaria de mesclar o diretório de origem com o diretório de destino. Mas isso só faria sentido quando a fonte fosse um diretório. Então, quando você executa cp somefile existing-directory/ , acaba com existing-directory/somefile ; e quando você executa cp -r somedir existing-directory/ , acaba com existing-directory/somedir . O comportamento que você acha intuitivo (mas que eu não entendo) exigiria que cp faça diferença dependendo se a origem é um diretório ou não, portanto, cp -r somefile somedir existing-directory/ criaria existing-directory/somefile , mas não existing-directory/somedir . / p>
cp something existing-directory copia a origem no diretório de destino. Se a fonte for um diretório e você quiser copiar seu conteúdo, execute
cp -rp something/* existing-directory/
Observe que isso omite arquivos cujo nome começa com . . Se você quiser incluí-los, uma maneira fácil é usar rsync :
rsync -a something/ existing-directory/
Com rsync , se você colocar um / no final da fonte, o conteúdo da origem será copiado no diretório de destino. Sem um / à direita na origem, a origem é criada como uma entrada no diretório de destino.