Це не 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
цього він просто пропустить каталоги.