Это оболочка, которая расширяет символы подстановки, а не команды. Итак, cp dir1/* dir2/*сначала расширяются два подстановочных знака, а затем вызывается cpрезультат. Это совсем не то, что вы, очевидно, ожидаете: в зависимости от того, сколько файлов уже есть dir2, dir2/*может быть расширен до одного или нескольких аргументов. Команда cpне знает, какие из ее аргументов были получены при расширении первого шаблона, а какие - при расширении второго шаблона. Ожидается, что его последним аргументом будет имя каталога назначения. Таким образом, чтобы скопировать все файлы из каталога dir1в каталог dir2, последний аргумент должен быть каталогом dir2:
cp dir1/* dir2
Так как *совпадает со всеми файлами, cpпытается скопировать все файлы. Это включает в себя каталоги: каталоги тоже файлы. Он пропускает каталоги, но сообщает об ошибке. Он копирует содержимое специальных файлов, таких как именованные каналы (что-то лучше записывать в них, или они cpбудут блокироваться) и т. Д.
Чтобы копировать только обычные файлы, вам нужно ограничить соответствие. В zsh вы можете использовать для этого квалификатор glob . :
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