Це оболонка, яка розширює символи, а не команди. Тож 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