Це оболонка, яка розширює символи, а не команди. Тож cp dir1/* dir2/*спочатку розширюються дві маски, а потім викликає cpрезультат. Це зовсім не те, що ви, очевидно, очікуєте: залежно від того, скільки файлів уже є dir2, dir2/*може розширюватися до одного або декількох аргументів. Команда cpне знає, який з її аргументів виник через розширення першого шаблону, а які - з розширення другого шаблону. Очікує, що його останнім аргументом буде ім'я каталогу призначення. Таким чином, щоб скопіювати всі файли з каталогу dir1в каталог dir2, останнім аргументом повинен бути каталог dir2:
cp dir1/* dir2
Оскільки *відповідає всім файлам, cpнамагається скопіювати всі файли. Сюди входять каталоги: каталоги також є файлами. Він пропускає каталоги, але повідомляє про помилку. Він копіює вміст спеціальних файлів, таких як іменовані канали (щось краще було б записати до них або cpзаблокувати) тощо.
Щоб копіювати лише звичайні файли, потрібно обмежити відповідність. У zsh ви можете використовувати класифікатор глоба . для цього:
cp dir1/*(.) dir2
Інші снаряди цього не мають. За допомогою findкоманди можна фільтрувати типи файлів. Якщо припустити, що ви використовуєте невбудований Linux або Cygwin:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
На Linux, FreeBSD та OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2