É o shell que expande curingas, não os comandos. Então, cp dir1/* dir2/*
primeiro expanda os dois curingas, depois chame cp
o 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 cp
nã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 dir1
para o diretório dir2
, o último argumento deve ser o diretório dir2
:
cp dir1/* dir2
Como *
corresponde a todos os arquivos, cp
tenta 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 cp
bloqueará), 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 find
comando 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