如何将文件名重命名为不同的编码?


8

file namereiserfs安装的硬盘驱动器上有3种编码类型:CP1251,KOI-8,UTF-8和ASCII。我确实需要递归将所有编码转换为UTF-8。是否有任何实用程序可以检测源编码并将其转换为UTF-8,还是我必须编写Python脚本?


在一般情况下,不可能自动“猜测”名称编码(例如,大多数字节序列是有效的KOI-8和CP1251(但有所不同)文件名)。您还有其他线索可以帮助您了解名称编码吗?

没有其他线索:(
Pablo

您是否同时具有小写和大写文件名?

是的,我同时具有小写和(全部)大写文件名。
Pablo 2015年

有人需要吗?结帐detox。它的工作对我来说ISO-8859-1和UTF-8之间使用-s iso8859_1-only
阿尔文凯斯勒

Answers:


12

使用convmv,这是一个CLI工具,可在不同的编码之间转换文件名。要将以下结果从(-f)转换为(-t)UTF-8,请执行以下操作:

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

另外,如果要转换文件内容,请使用iconvCLI工具将文件内容转换为不同的编码。要将以下结果从(-f)转换为(-t)UTF-8,请执行以下操作:

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

1
它不是我需要转换的文件内容,而是文件名本身
Pablo 2015年

好的。您尝试过convmv吗?
Marcos Roriz Junior

ASCII已经是UTF-8的子集,因此无需进行转换。
psusi 2015年

1

不。旧代码页系统的一大弊端是无法检测到正在使用哪个代码。您必须简单地知道先验。如果您知道哪些文件正在使用哪种编码,则可以使用以下方式转换名称:

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

太多文件无法手动重命名...我认为代码页具有不同的字符代码范围。
Pablo 2015年

@Pablo,不,这就是重点:在8位字节中,您只有256个可能的字符代码。减去正常的ASCII字符集和控制代码集后,剩下128个可用于附加代码,这不足以代表所有语言的全部字符。每个代码页都使用上面的128个代码来表示对用户重要的字符。找出正在使用的唯一方法是尝试显示每个可能的代码页,并查看该名称是否看起来有意义,并且该名称不是计算机决定的。
psusi

好吧,python chardet正在以某种方式检测到它……
Pablo 2015年

@Pablo,整洁的...看起来它基于书面语言中不同字符的普遍程度做出了有根据的猜测。换句话说,它假设某些字符(如愚蠢的字形)不如说重音符号“ a”流行,并尝试解释每个代码页中的字符,并找到与大多数流行字符匹配的代码最多的代码。不过,它可能不太准确,尤其是在字符数少的情况下,例如文件名。
psusi

0

iconv@psusi sugeses 相同的解决方案,但具有循环和while卡:

也是oneline shell sh脚本:

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

从管道读取卡时:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
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.