如何在Linux上分辨文件名的语言编码?


17

我有一个包含来自外部来源的约10,000个图像文件的目录。

许多文件名包含非DB友好或Web友好的空格和标点符号。我还想在每个文件名的末尾附加一个SKU编号(出于会计目的)。许多(如果不是大多数)文件名还包含扩展的拉丁字符,我想保留这些扩展的拉丁字符用于SEO(具体来说,这样文件名就可以准确表示Google图像中的文件内容)

我制作了一个bash脚本,该脚本将所有文件重命名(复制)到所需的结果。bash脚本保存在UTF-8中。运行后,它将忽略大约500个文件(无法统计文件...)。

我在目录上运行了convmv -f UTF-8 -t UTF-8,发现这500个文件名以UTF-8编码(convmv能够检测和忽略UTF-8中已经存在的文件名)

有没有一种简单的方法可以找出他们当前正在使用哪种语言编码?

我能弄清楚自己的唯一方法是将终端编码设置为UTF-8,然后使用convmv遍历所有可能的候选编码,直到显示出“看起来正确”的转换名称。我无法确定这500个文件全部使用相同的编码,因此我需要将此过程重复500次。我想要一种比“看起来不错”更自动化的方法!

Answers:


13

确实没有100%准确的方法,但是有一种方法可以给出一个很好的猜测。

这里有可用的python库chardet:https : //pypi.python.org/pypi/chardet

例如

查看当前的LANG变量设置为什么:

$ echo $LANG
en_IE.UTF-8

创建一个需要使用UTF-8编码的文件名

$ touch mÉ.txt

更改我们的编码,看看尝试列出它时会发生什么

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

好的,现在我们有了一个以UTF-8编码的文件名,并且当前的语言环境是C(标准Unix代码页)。

因此,启动python,导入chardet并使其读取文件名。我正在使用一些外壳程序(即通过*通配符进行扩展)来获取文件。将“ ls m *”更改为与您的示例文件之一匹配的任何值。

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

如您所见,这只是一个猜测。“ confidence”变量显示猜测的准确性。


脚本按所述方式工作,但就我而言,chardet找不到文件的编码。
Fedir RYKHTIK '02

6

您可能会发现这对测试当前工作目录(python 2.7)非常有用:

import chardet
import os  

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

结果看起来像:

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)

要从当前目录递归槽路径,请将其剪切并粘贴到一个小的python脚本中:

#!/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'])

这也可以使用亚洲编码吗?还是以欧洲为中心?
rwire
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.