Это не ошибка cp , это bash: bash раскрывает * во всех не скрытых (то есть: не начинающихся с .) Файлах.
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
но вы, вероятно, найдете более чистые решения.