ls має деякі перемикачі (наприклад - ім'я котирування, --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 (новий рядок), побудуйте рядовий рядок і використовуйте параметр -e ехо для перекладу виходу:
$ 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
чи щось подібне?