Bagaimana cara mengganti nama file menjadi penyandian yang berbeda?

8

Saya memiliki 3 jenis file namepengkodean pada reiserfshard drive yang terpasang: CP1251, KOI-8, UTF-8 dan ASCII. Saya benar-benar perlu mengubah semua penyandian menjadi UTF-8, secara rekursif. Apakah ada utilitas, yang akan mendeteksi pengkodean sumber dan mengubahnya menjadi UTF-8 atau saya harus menulis skrip Python?

Pablo
sumber
Dalam kasus umum, tidak mungkin untuk secara otomatis "menebak" pengkodean nama (misalnya, sebagian besar urutan byte adalah KOI-8 dan nama file CP1251 (tetapi berbeda) yang valid). Apakah Anda memiliki petunjuk tambahan untuk membantu mengetahui pengodean nama?
Tidak ada petunjuk lain :(
Pablo
Apakah Anda memiliki nama file huruf kecil dan besar?
Ya, saya memiliki nama file huruf kecil dan (semua) huruf besar.
Pablo
Adakah yang membutuhkan? Lihat detox. Ini bekerja untuk saya antara ISO-8859-1 dan UTF-8 menggunakan-s iso8859_1-only
Alwin Kesler

Jawaban:

12

Gunakan convmv, alat CLI yang mengubah nama file antara pengkodean yang berbeda. Untuk mengkonversi dari ( -f) pengkondisian ini ke ( -t) UTF-8 lakukan hal berikut:

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

Selain itu, jika Anda ingin mengonversi konten file, gunakan iconv, alat CLI untuk mengonversi konten file ke penyandian berbeda. Untuk mengkonversi dari ( -f) pengkondisian ini ke ( -t) UTF-8 lakukan hal berikut:

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
sumber
1
Bukan konten file yang perlu saya konversi, tetapi nama file itu sendiri
Pablo
Baik. Apakah Anda mencoba convmv?
Marcos Roriz Junior
ASCII sudah merupakan bagian dari UTF-8 sehingga tidak perlu mengkonversi.
psusi
1

Nggak. Salah satu kelemahan besar sistem halaman kode lama adalah bahwa tidak ada cara untuk mendeteksi mana yang sedang digunakan; Anda hanya harus tahu itu apriori. Jika Anda tahu file mana yang menggunakan pengkodean mana maka Anda dapat mengonversi nama menggunakan sesuatu seperti:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`
psusi
sumber
Terlalu banyak file untuk diganti nama secara manual ... Saya pikir codepages memiliki rentang kode karakter yang berbeda.
Pablo
@Pablo, tidak, itulah intinya: dengan byte 8 bit Anda hanya memiliki 256 kode karakter yang mungkin. Setelah mengurangkan set normal karakter ASCII dan kode kontrol yang meninggalkan 128 kode tambahan, yang tidak cukup untuk mewakili berbagai karakter dalam semua bahasa. Setiap halaman kode menggunakan sendiri 128 kode teratas tersebut untuk mewakili karakter yang penting bagi pengguna. Satu-satunya cara untuk mencari tahu yang sedang digunakan adalah mencoba menampilkan setiap halaman kode yang mungkin dan melihat apakah nama itu masuk akal dan itu bukan sesuatu yang komputer dan putuskan.
psusi
yah, python chardetentah bagaimana mendeteksinya ...
Pablo
@Pablo, rapi ... sepertinya itu membuat tebakan yang dididik berdasarkan prevalensi karakter yang berbeda dalam bahasa tertulis. Dengan kata lain, itu mengasumsikan bahwa karakter tertentu, seperti mesin terbang konyol kurang populer daripada mengatakan, aksen 'a', dan mencoba menafsirkan karakter di setiap halaman kode dan menemukan yang memiliki kode paling sesuai dengan karakter yang lebih populer. Namun sepertinya itu tidak terlalu akurat, terutama pada sejumlah kecil karakter, seperti nama file.
psusi
0

Solusi yang sama dengan iconvas @psusi tetapi dengan loop dan kartu-sementara:

Juga shskrip shell oneline :

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

Dengan membaca kartu sementara dari saluran pipa:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
oklas
sumber