Это не 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
этого он просто пропустит каталоги.