Это не ошибка 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
но вы, вероятно, найдете более чистые решения.