Você tem um problema de codificação que deve ser resolvido.
O ? exibido por ls é um marcador e não significa que o arquivo tenha o nome ? .
Veja como reproduzir seu problema usando iconv , em um sistema Linux configurado utf8 usual:
$ mkdir /tmp/test
$ cd /tmp/test
$ touch $(echo é | iconv -t windows-1252) # that's the eacute character
$ ls
?
$ ls|cat
�
A última linha significa apenas que "a codificação utf8 inválida é exibida" e provavelmente não pode ser copiada / colada corretamente sem perder suas informações. windows-1252 é apenas um exemplo. Pode ter sido muitos outros (por exemplo: iso-8859-1 ). A informação ainda está lá:
$ ls|iconv -f windows-1252
é
Então, depois de descobrir qual codificação foi usada para gravar esses arquivos no Linux (tente iconv -l|egrep -i 'win|iso-8859' para uma possível lista de candidatos), você pode tentar renomear alguns lotes. Tenha cuidado enquanto um exemplo pode funcionar, pode falhar em outro arquivo.
Exemplo de renomeação:
ENCODING="windows-1252" # once the right encoding was found
for file in *; do
dest="$(printf '%s' "$file" | iconv -f "$ENCODING")"
mv -i "$file" "$dest.new"
mv -i "$dest.new" "$dest"
done