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.