Это не cp«s вина , это Баш: Баш расширяет *во всех без скрытого (т.е. не отправной с .) файлов.
Bash расширится .*(таким образом A/.*, в вашем случае) со всеми файлами, начинающимися с ., но, к несчастью, он также включает .и ..(текущий и родительский каталоги), которые вы, вероятно, захотите пропустить. (Обратите внимание, что другие оболочки, такие как zsh, не будут включать их, и IIRC также bash, после установки некоторых параметров).
Простое решение может состоять в том, чтобы удалить .и ..из файлов, сопоставленных .*, (очень) хакерским способом, как этот:
cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B
или этот (вероятно, чище: он использует findдля поиска файлов для копирования):
cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B
но вы, вероятно, найдете более чистые решения.
-r. Без-rэтого он просто пропустит каталоги.