Você parece entender o que está acontecendo perfeitamente bem. No seu exemplo, *pdf de fato se expande para file1.pdf file2.pdf this_is_a_folder.pdf . Eu não vejo o que está te confundindo. cp está fazendo exatamente o que deveria, você está dizendo para copiar file1.pdf e file2.pdf para this_is_a_folder.pdf e é exatamente isso que está fazendo. Não há bug, está funcionando como anunciado.
Como o nome da sua pasta termina em .pdf , ele é incluído em *.pdf e, como é uma pasta e o último argumento (classificado em ordem alfabética), cp copia os arquivos para ele. Para obter o comportamento esperado, é necessário proteger o curinga do shell para que ele não seja expandido antes que cp o veja:
$ cp "*pdf"
cp: missing destination file operand after '*pdf'
Try 'cp --help' for more information.
Observe que, nesse caso, o curinga não é expandido, portanto cp está procurando um arquivo chamado *.pdf . Então, mesmo se você fosse chamá-lo com um diretório como o último argumento ( cp "*.pdf" foo/ ), ele reclamaria sobre cannot stat '*.pdf': No such file or directory . Você também verá seu comportamento esperado se tentar cp *pdf em um diretório que contenha apenas um arquivo que termine em .pdf porque *.pdf será expandido para apenas um argumento:
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file1.pdf
$ cp *pdf
cp: missing destination file operand after 'file1.pdf'
Try 'cp --help' for more information.
Compare também com isso:
$ ls -l
total 0
drwxr-xr-x 1 terdon terdon 0 Aug 5 16:56 a_folder.pdf
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file1.pdf
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file2.pdf
$ cp *pdf
cp: target 'file2.pdf' is not a directory
Aqui, como o nome da pasta começa com a , *.pdf é expandido para:
%código%. Portanto, o comando a_folder.pdf file1.pdf file2.pdf que está sendo executado é
cp a_folder.pdf file1.pdf file2.pdf
O que retorna um erro porque o último argumento não é um diretório.