У ls есть несколько ключей (например, --quote-name, --escape, --literal) для работы с непечатаемыми символами, но в этом случае кажется, что символ «печатается», но не «печатается» (по крайней мере, на моей клавиатуре! ), так что ни один из этих ключей, кажется, не помогает.
Следовательно, в качестве общего подхода «грубой силы» для избавления от файлов с любыми символами в именах, вы можете сделать это:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Найдите строку, содержащую поврежденный файл. Вполне вероятно, что это будет 1-я строка, но, скажем, 5-я. Выведите строку 5 и закодируйте ее шестнадцатерично:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Игнорируя символ 0a (перевод строки), создайте escape-строку и используйте параметр -e echo для перевода escape-символов:
$ echo -e '\xe2\x99\xab'
♫
Теперь вы можете скопировать / переместить / удалить его так:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Кроме того, если вы не ограничены использованием сценария оболочки, вы можете сделать это на Python следующим образом:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Используя этот подход, вы можете обрабатывать много файлов, вам просто нужно написать логику для выбора правильных файлов и переименования их без зазубрин и т. Д .:
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
или как то так?