Existem três questões distintas para abordar aqui:
A ?
em ls
Não é verdade que ls
mostrará os caracteres reais em um nome de arquivo.
Por exemplo, os seguintes nomes de arquivos contêm caracteres que ls
pode substituir (nem sempre) por ?
:
$ eval "$(printf "a='\n' b=2 c=–")"
$ touch test{"$a","$b","$c"}file
$ ls --quoting-style=literal test*
test?file test?file test–file
Mas isso não usará ?
(é o shell listando os arquivos):
$ echo test*
test
file testfile test–file
Claro, para mostrar os caracteres (codificados):
$ echo test* | od -An -tc
t e s t \n f i l e t e s t 032 f i l e
t e s t 342 200 223 f i l e \n
Então, você precisa usar algo como od
para ver realmente os caracteres usados no arquivo.
$ touch 'some–file_with_pattern'
$ echo *pattern* | od -An -tc
s o m e 342 200 223 f i l e _ w i t h _ p a t t e r n \n
codificação
Observe que acima do longo traço é sempre mostrado corretamente como o caractere visível: –
(em oposição ao ?
em seus exemplos) porque a codificação está definida corretamente para utf-8.
E, em seguida, tente esta linha, deve imprimir os mesmos caracteres que você vê nesta página da web.
$ echo 'áé€íìïîößđ₣λŕžç× Москва Ελληνικά'
áé€íìïîößđ₣λŕžç× Москва Ελληνικά
codificação do sistema de arquivos
Os dois problemas acima devem resolver o problema em 99% dos casos, exceto naqueles em que a codificação do sistema de arquivos não corresponde à codificação de localidade ou é diferente entre os dois sistemas de arquivos envolvidos.
Certifique-se de que não há nenhum problema com os dois problemas acima antes mesmo de analisar esse problema. Leia O mesmo arquivo, nome diferente do arquivo devido ao problema de codificação?