Isso é simples:
Estamos trabalhando em um loop for em todos os arquivos, cujo nome contém um ' ? '.
Esse loop chama um comando mv (== rename) com todos esses arquivos, mais esses nomes de arquivos sem a parte deles depois que ' ? '.
O comando exato é o seguinte:
for i in *\?*;do mv -vf "${i}" "${i%%\?*}";done
O que parece ser um pouco enigmático, é o "${i%%\?*}" . Isso significa: "a variável chamada 'i', removida de sua cauda depois de um ' ? '.
Há também um pouco de coisa enigmática, que é a parte *\?* . Isso significa todos os arquivos no diretório atual, cujo nome contém um ' ? '. Este é um padrão, assim como em (win) do (w) s, a única diferença é que ' ? ' significa por padrão todos os caracteres. A barra invertida (' \ ') é usada para remover esse significado especial disso.