Jak zmienić nazwy plików na inne kodowanie?

8

Mam 3 rodzaje file namekodowania na reiserfszamontowanym dysku twardym: CP1251, KOI-8, UTF-8 i ASCII. Naprawdę muszę rekurencyjnie przekonwertować wszystkie kodowania na UTF-8. Czy jest jakieś narzędzie, które wykryje kodowanie źródłowe i przekonwertuje je na UTF-8, czy też muszę napisać skrypt w języku Python?

Pablo
źródło
W ogólnym przypadku nie jest możliwe automatyczne „odgadnięcie” kodowania nazwy (na przykład większość sekwencji bajtów ma poprawne nazwy plików KOI-8 i CP1251 (ale różne)). Czy masz jakieś dodatkowe wskazówki, które pomogą poznać kodowanie nazw?
Żadnych innych wskazówek :(
Pablo
Czy masz zarówno małe, jak i wielkie nazwy plików?
Tak, mam nazwy zarówno małych, jak i (wszystkich) wielkich liter.
Pablo
Ktoś w potrzebie? Sprawdź detox. Działa dla mnie między ISO-8859-1 a UTF-8 przy użyciu-s iso8859_1-only
Alwin Kesler

Odpowiedzi:

12

Użyj convmv, narzędzia CLI, które konwertuje nazwę pliku między różnymi kodowaniami. Aby przekonwertować z ( -f) tych kodowań na ( -t) UTF-8, wykonaj następujące czynności:

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

Ponadto, jeśli chcesz przekonwertować zawartość pliku, użyj iconvnarzędzia CLI do konwersji treści pliku na różne kodowania. Aby przekonwertować z ( -f) tych kodowań na ( -t) UTF-8, wykonaj następujące czynności:

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile
Marcos Roriz Junior
źródło
1
To nie treść pliku muszę przekonwertować, ale sama nazwa pliku
Pablo
W porządku. Próbowałeś convmv?
Marcos Roriz Junior
ASCII jest już podzbiorem UTF-8, więc nie ma potrzeby konwersji.
psusi
1

Nie. Jedną z dużych wad starego systemu stron kodowych jest brak możliwości wykrycia, który z nich jest używany; musisz po prostu wiedzieć, że a priori. Jeśli wiesz, które pliki używają kodowania, możesz przekonwertować nazwy, używając czegoś takiego:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
źródło
Zbyt wiele plików do ręcznej zmiany nazwy ... Myślałem, że strony kodowe mają różne zakresy znaków.
Pablo
@Pablo, nie, to jest cały punkt: 8-bitowy bajt miał tylko 256 możliwych kodów znaków. Po odjęciu normalnego zestawu znaków ASCII i kodów kontrolnych pozostawia 128 pozostałych kodów, co nie wystarcza do przedstawienia pełnego zakresu znaków we wszystkich językach. Każda strona kodowa wykorzystuje własne górne 128 kodów do reprezentowania znaków ważnych dla użytkownika. Jedynym sposobem, aby dowiedzieć się, który jest w użyciu, jest próba wyświetlenia każdej możliwej strony kodowej i sprawdzenie, czy nazwa wydaje się mieć sens, a to nie jest komputer i decyzja.
psusi
cóż, python chardetjakoś to wykrywa ...
Pablo
@Pablo, schludny ... wygląda na to, że zgrabnie zgaduje na podstawie rozpowszechnienia różnych znaków w języku pisanym. Innymi słowy, zakłada, że ​​niektóre znaki, takie jak głupkowate glify, są mniej popularne niż powiedzą, akcentowane „a”, i próbuje interpretować znaki na każdej stronie kodowej i znajduje taki, który ma najwięcej kodów pasujących do bardziej popularnych znaków. Prawdopodobnie nie jest to zbyt dokładne, szczególnie w przypadku niewielkiej liczby znaków, takich jak nazwa pliku.
psusi
0

iconvTakie samo rozwiązanie jak w przypadku spsses @psusi, ale z pętlą i kartą while:

Również shskrypt powłoki oneline :

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

Z odczytem karty while z linii rurowej:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
źródło