ls tiene algunos interruptores (como --quote-name, --escape, --literal) para tratar con caracteres no imprimibles, pero en este caso parece que el carácter es "imprimible" pero no "escribible" (¡al menos en mi teclado! ), por lo que ninguno de estos interruptores parece ayudar.
Por lo tanto, como un enfoque general de "fuerza bruta" para deshacerse de los archivos con cualquier carácter en sus nombres, puede hacer esto:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Encuentra la línea que contiene el archivo ofensivo. Es muy probable que sea la primera línea, pero digamos que es la quinta. Imprima la línea 5 y la codifique hexadecimal:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Ignorando el carácter 0a (nueva línea), construya una cadena de escape y use la opción -e de echo para traducir los escapes:
$ echo -e '\xe2\x99\xab'
♫
Ahora puede copiarlo / moverlo / eliminarlo así:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Además, si no está limitado a usar el script de shell, puede hacerlo en Python de esta manera:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Con este enfoque, puede procesar muchos archivos, solo tiene que escribir la lógica para seleccionar los archivos correctos y renombrarlos sin tropezar, 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
¿o algo como esto?