Ao copiar usando, cp -a source/* target/você está copiando a maioria dos arquivos e diretórios de sourcepara target. Especificamente, os itens excluídos provavelmente serão arquivos começando com um ponto ( .) no nível superior de source.
Considere esses arquivos (ou diretórios) em source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Ao copiar usando, cp -a source/. target/você está copiando todo o conteúdo source, incluindo itens que começam com um ponto ( .) paratarget
Considere esses arquivos (ou diretórios) em source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Se você estiver usando bash, zshpoderá usar a dotglobopção para alterar o significado de, *para que ele inclua arquivos e diretórios que começam com um ponto ( yashtambém tem uma dotglobopção; no entanto, ele inclui .e ..em expansões globais que limitam sua usabilidade. FIGNORE='@(.|..)'in ksh93).
Curiosamente, cp -a source/. target/é garantido nunca criar o componente target/source. (Por outro lado, cp -a source target/fará uma de duas coisas, dependendo da sua existência ou não target. Consulte Como copiar uma pasta recursivamente de maneira idempotente usando cp para obter detalhes.)
Ao excluir usando, rm -rf source/*você exclui os arquivos e diretórios dentro deles sourceque não começam com um ponto ( .). Sujeito à dotglobconfiguração que eu já mencionei. Não excluirá o sourcepróprio diretório .
Quando você tenta excluir o uso, rm -rf source/.ele falha - como outros já explicaram - porque o POSIX proíbe a exclusão de um caminho cujo último componente é .ou ... O equivalente mais próximo é rm -rf source, que excluirá o sourcediretório e todo o seu conteúdo, independentemente de começarem ou não com um ponto ( .).
It's up to the command whether that trailing dot makes any senseHum, o ponto sempre está vinculado ao próprio diretório, portanto../foldersource/., não deve ser diferente de declarar./foldersource/e, de fato, é apenas uma maneira redundante de afirmar a mesma coisa. Nenhum comando tenta "entender" o ponto ou o ponto duplo, pois estes são padrão nos sistemas de arquivos Linux / Unix.rmsimplesmente rejeita a remoção do diretório de trabalho atual, conformejimmijindicado na resposta. Além disso, observe que você está usando./em todos os seus exemplos enquanto o OP está../lá. Um pouco de (grande) diferença.