O ls possui algumas opções (como --quote-name, --escape, --literal) para lidar com caracteres não imprimíveis, mas, neste caso, parece que o personagem é "imprimível", mas não "tipificável" (pelo menos no meu teclado! ), portanto, nenhuma dessas opções parece ajudar.
Portanto, como uma abordagem geral de "força bruta" para se livrar de arquivos com caracteres em seus nomes, você pode fazer o seguinte:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Encontre a linha que contém o arquivo incorreto. Provavelmente será a primeira linha, mas digamos que seja a quinta. Imprima a linha 5 e codifique hexadecimalmente:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Ignorando o caractere 0a (nova linha), construa uma string de escape e use a opção -e de echo para traduzir os escapes:
$ echo -e '\xe2\x99\xab'
♫
Agora você pode copiar / mover / excluir da seguinte forma:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Além disso, se você não estiver confinado ao uso de shell script, poderá fazê-lo no Python assim:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Usando esta abordagem, você pode processar muitos arquivos, basta escrever a lógica para selecionar os arquivos corretos e renomeá-los sem bater de frente, etc:
for f in os.listdir('.'):
if not f.isalnum():
newname = generate_newname(f)
if not os.path.exists(newname):
shutil.copy(f, newname)
else:
print newname, 'already exists!'
*restoffile.avi
ou algo parecido com isto?