ls a quelques commutateurs (comme --quote-name, --escape, --literal) pour gérer les caractères non imprimables, mais dans ce cas, il semble que le caractère soit "imprimable" mais pas "typable" (du moins sur mon clavier! ), donc aucun de ces commutateurs ne semble aider.
Par conséquent, en tant qu'approche générale de "force brute" pour se débarrasser des fichiers avec des caractères dans leurs noms, vous pouvez faire ceci:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Recherchez la ligne contenant le fichier incriminé. Ce sera probablement la 1ère ligne, mais disons que c'est la 5e. Imprimez la ligne 5 et hexadécimez-la:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
En ignorant le caractère 0a (nouvelle ligne), construisez une chaîne d'échappement et utilisez l'option -e d'écho pour traduire les échappements:
$ echo -e '\xe2\x99\xab'
♫
Vous pouvez maintenant le copier / déplacer / supprimer comme ceci:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
De plus, si vous n'êtes pas limité à l'utilisation d'un script shell, vous pouvez le faire en Python comme ceci:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
En utilisant cette approche, vous pouvez traiter de nombreux fichiers, il vous suffit d'écrire la logique de sélection des fichiers appropriés et de les renommer sans vous encombrer, 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 quelque chose comme ça?