Ha alcuni switch (come --quote-name, --escape, --literal) per gestire i caratteri non stampabili, ma in questo caso sembra che il personaggio sia "stampabile" ma non "tipizzabile" (almeno sulla mia tastiera! ), quindi nessuno di questi interruttori sembra aiutare.
Pertanto, come approccio generale "forza bruta" per sbarazzarsi di file con qualsiasi carattere nei loro nomi, è possibile fare questo:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Trova la riga contenente il file offensivo. Molto probabilmente sarà la prima linea, ma diciamo che è la quinta. Stampa la riga 5 ed esadecimale codificala:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Ignorando il carattere 0a (newline), costruisci una stringa di escape e usa l'opzione -e di echo per tradurre gli escape:
$ echo -e '\xe2\x99\xab'
♫
Ora puoi copiarlo / spostarlo / eliminarlo in questo modo:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Inoltre, se non sei limitato all'uso dello script di shell, puoi farlo in Python in questo modo:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Usando questo approccio, puoi elaborare molti file, devi solo scrivere la logica per selezionare i file corretti e rinominarli senza clobbering, ecc:
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
o qualcosa del genere?