rwi*_*red 18 linux ext3 encoding
我有一个目录,其中包含来自外部源的约 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 次。我想要一种比“看起来正确”更自动化的方法!!!
Phi*_*lds 15
真的没有 100% 准确的方法,但有一种方法可以给出一个很好的猜测。
这里有一个 python 库 chardet:https : //pypi.python.org/pypi/chardet
例如
查看当前 LANG 变量设置为:
$ echo $LANG
en_IE.UTF-8
Run Code Online (Sandbox Code Playgroud)
创建一个需要用 UTF-8 编码的文件名
$ touch mÉ.txt
Run Code Online (Sandbox Code Playgroud)
更改我们的编码,看看当我们尝试列出它时会发生什么
$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt
Run Code Online (Sandbox Code Playgroud)
好的,现在我们有一个以 UTF-8 编码的文件名,我们当前的语言环境是 C(标准 Unix 代码页)。
所以启动python,导入chardet并让它读取文件名。我正在使用一些 shell 通配符(即通过 * 通配符扩展)来获取我的文件。将“ls m*”更改为与您的示例文件之一匹配的任何内容。
>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}
Run Code Online (Sandbox Code Playgroud)
如您所见,这只是一个猜测。“置信度”变量显示了猜测的好坏。
您可能会发现这很有用,以测试当前工作目录(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'])
Run Code Online (Sandbox Code Playgroud)
结果看起来像:
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)
Run Code Online (Sandbox Code Playgroud)
要从当前目录递归路径路径,请将其剪切并粘贴到一个小的 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'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32958 次 |
| 最近记录: |