O que acontece é que o bash primeiro expande *.djvu{,.bk}
para *.djvu
*.djvu.bk
e, em seguida, faz a expansão glob sobre eles. Isso explicaria
o que você observa: no seu caso, *.djvu
, corresponde a um arquivo existente,
digamos foo.djvu
e expande para isso, mas *.djvu.bk
não corresponde a nenhum arquivo,
e assim se expande como, *.djvu.bk
.
A ordem de expansão é especificada na documentação do bash:
The order of expansions is: brace expansion, tilde expansion, parame‐
ter, variable and arithmetic expansion and command substitution (done
in a left-to-right fashion), word splitting, and pathname expansion.
Sugiro que você reescreva seu comando de cópia como:
for f in *.djvu; do cp -- "$f" "$f".bk; done
Ou talvez, para evitar a sobrecarga sintática de um loop for explícito:
parallel -j1 cp -- {} {}.bk ::: *.djvu
(pensando duas vezes ... isso não é muito mais curto.)
Para responder à sua sub-questão "como poderia ser expandido", pode-se usar
um subcomando (exemplo em um diretório contendo apenas foo.djvu
e
bar.djvu
):
$ echo $(echo *.djvu){,.bk}
bar.djvu foo.djvu bar.djvu foo.djvu.bk
Mas essa não é uma solução tão segura quanto o loop for ou a chamada paralela acima; ele vai quebrar em nomes de arquivos contendo espaço em branco.