Это оболочка, которая расширяет символы подстановки, а не команды. Итак, 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