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