É o shell que expande curingas, não os comandos. Então, cp dir1/* dir2/*primeiro expanda os dois curingas, depois chame cpo resultado. Aparentemente, isso não é o que você espera: dependendo de quantos arquivos já existem dir2, você dir2/*pode expandir para um ou mais argumentos. O comando cpnão sabe quais argumentos vieram da expansão do primeiro padrão e quais vieram da expansão do segundo padrão. Ele espera que seu último argumento seja o nome do diretório de destino. Portanto, para copiar todos os arquivos do diretório dir1para o diretório dir2, o último argumento deve ser o diretório dir2:
cp dir1/* dir2
Como *corresponde a todos os arquivos, cptenta copiar todos os arquivos. Isso inclui diretórios: diretórios também são arquivos. Ignora diretórios, mas relata um erro. Ele copia o conteúdo de arquivos especiais, como pipes nomeados (é melhor que algo esteja gravando neles, ou cpbloqueará), etc.
Para copiar apenas arquivos regulares , você precisa restringir a correspondência. No zsh, você pode usar o qualificador glob . para isso:
cp dir1/*(.) dir2
Outras conchas não têm isso. Você pode usar o findcomando para filtrar os tipos de arquivo. Supondo que você esteja executando Linux ou Cygwin não incorporado:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
No Linux, FreeBSD e OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2