Linux'ta bir dosya adının dil kodlamasını nasıl söyleyebilirim?


17

Harici bir kaynaktan ~ 10,000 resim dosyaları ile bir dizin var.

Birçok dosya adları boşluk ve DB dost dost veya Web olmayan noktalama işaretleri içerir. Ayrıca her dosya adının sonuna (muhasebe amacıyla) bir SKU numarası eklemek istiyorum. Çoğu, dosya adlarının çoğu değilse , SEO amaçları için saklamak istediğim genişletilmiş latin karakterler içeriyorsa (özellikle dosya adları Google Görseller'deki dosya içeriğini doğru bir şekilde temsil eder)

İstediğim sonuca tüm dosyaları yeniden adlandıran (kopyalayan) bir bash betiği yaptım. Bash komut dosyası UTF-8'e kaydedilir. Çalıştırdıktan sonra yaklaşık 500 dosyayı atlar (stat dosyası yapılamıyor ...).

Ben yayınlandıktan Convmv -f UTF-8 -t UTF-8 dizin ve bu 500 dosya vardır keşfedilen değil UTF-8 olarak kodlanmış (Convmv algılamak ve UTF-8 dosya adlarının zaten görmezden gelebiliyor)

Şu anda hangi dil kodlamasını kullandıklarını öğrenmenin kolay bir yolu var mı ?

Kendimi anlayabilmemin tek yolu, terminal kodlamamı UTF-8'e ayarlamak ve sonra 'doğru görünen' dönüştürülmüş bir ad görüntüleyene kadar convmv ile tüm olası aday kodlamalarını tekrarlamaktır. Bu 500 dosyanın hepsinin aynı kodlamayı kullandığından emin olmanın bir yolu yok, bu yüzden bu işlemi 500 kez tekrarlamanız gerekecek. 'Doğru görünüyor' daha otomatik bir yöntem istiyorum !!!

Yanıtlar:


13

Gerçekten% 100 doğru bir yol yok, ama iyi bir tahmin yapmanın bir yolu var.

Burada bulunan bir python kütüphane pazı vardır: https://pypi.python.org/pypi/chardet

Örneğin

Geçerli LANG değişkeninin neye ayarlandığını görün:

$ echo $LANG
en_IE.UTF-8

UTF-8 ile kodlanması gereken bir dosya adı oluşturun

$ touch mÉ.txt

Kodlamamızı değiştirin ve kodlamayı denediğimizde ne olacağını görün

$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt

Tamam, şimdi UTF-8 ile kodlanmış bir dosya adımız var ve mevcut yerel ayarımız C (standart Unix kod sayfası).

Python'u başlatın, pazı alın ve dosya adını okumasını sağlayın. Benim dosya almak için bazı kabuk globbing (yani * joker karakter yoluyla genişleme) kullanın. "Ls m *", örnek dosyalarınızdan biriyle eşleşecek şekilde değiştirin.

>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}

Gördüğünüz gibi, bu sadece bir tahmin. Bir tahminin ne kadar iyi olduğu "güven" değişkeni ile gösterilir.


betik açıklandığı gibi çalışır, ancak benim durumumda, chardet dosyanın kodlamasını bulamadı.
Fedir RYKHTIK

6

Geçerli çalışma dizinini (python 2.7) sınamak için bunu yararlı bulabilirsiniz:

import chardet
import os  

for n in os.listdir('.'):
    print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

Sonuç şöyle görünür:

Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)

Geçerli dizindeki çukur yolunu tekrarlamak için bunu kesip yapıştırın ve küçük bir python betiğine yapıştırın:

#!/usr/bin/python

import chardet
import os

for root, dirs, names in os.walk('.'):
    print root
    for n in names:
        print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])

Bu Asya kodlamasında da işe yarıyor mu? Yoksa Eurocentric mi?
rwired
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.