ls ma kilka przełączników (takich jak - quote-name, --escape, --literal) do obsługi znaków niedrukowalnych, ale w tym przypadku wydaje się, że znak jest „drukowalny”, ale nie „wpisywalny” (przynajmniej na mojej klawiaturze! ), więc żaden z tych przełączników nie wydaje się pomóc.
Dlatego jako ogólne podejście „brutalnej siły”, aby pozbyć się plików z dowolnymi postaciami w ich nazwach, możesz to zrobić:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Znajdź wiersz zawierający niepoprawny plik. Całkiem prawdopodobne, że będzie to pierwsza linia, ale powiedzmy, że to piąta. Wydrukuj wiersz 5 i zakoduj go szesnastkowo:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Ignorując znak 0a (nowy wiersz), skonstruuj łańcuch zmiany znaczenia i użyj opcji -e echa, aby przetłumaczyć znaki zmiany znaczenia:
$ echo -e '\xe2\x99\xab'
♫
Teraz możesz skopiować / przenieść / usunąć w następujący sposób:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Ponadto, jeśli nie jesteś ograniczony do używania skryptu powłoki, możesz to zrobić w Pythonie w następujący sposób:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Korzystając z tego podejścia, możesz przetwarzać wiele plików, wystarczy napisać logikę wyboru właściwych plików i zmiany ich nazwy bez blokowania itp.
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
lub coś w tym stylu?