如何在脚本中findUnix文件的编码

我需要find放置在目录中的所有文件的编码。 有没有办法find使用的编码?

file命令不能做到这一点。

我感兴趣的编码是:ISO-8859-1。 如果编码是其他的,我想把文件移动到另一个目录。

听起来你正在寻找enca 。 它可以猜测甚至编码之间的转换。 只要看看手册页 。

或者,如果失败,请使用file -i (linux)或file -I (osx)。 这将输出文件的MIMEtypes信息,该信息还将包含字符集编码。 我也find了一个手册页 🙂

 file -bi <file name> 

如果你喜欢这样做一堆文件

 for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done 

uchardet – 从Mozilla移植的编码检测程序库。

用法:

 ~> uchardet file.java UTF-8 

各种Linux发行版(Debian / Ubuntu,OpenSuse-packman,…)提供了二进制文件。

这里是一个示例脚本使用文件-I和iconv在MacOsX上工作对于你的问题,你需要使用MV而不是iconv

 #!/bin/bash # 2016-02-08 # check encoding and convert files for f in *.java do encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=` case $encoding in iso-8859-1) iconv -f iso8859-1 -t utf-8 $f > $f.utf8 mv $f.utf8 $f ;; esac done 

真的很难确定它是否是iso-8859-1。 如果你有一个只有7位字符的文本,也可能是iso-8859-1,但你不知道。 如果你有8位字符,那么上面的区域字符也按顺序编码。 因此,您将不得不使用字典来更好地猜测它是哪一个字,并从那里确定它必须是哪个字母。 最后如果你发现它可能是utf-8比你确定它不是iso-8859-1

编码是最难的事情之一,因为你永远不知道没有任何东西在告诉你

如果您正在讨论XML文件(ISO-8859-1),那么它们内部的XML声明指定了编码: <?xml version="1.0" encoding="ISO-8859-1" ?>
所以,你可以使用正则expression式(例如perl )来检查每个文件的规格。
更多信息可以在这里find: 如何确定文本文件编码 。

使用Python,您可以使用chardet模块: https : //github.com/chardet/chardet

这不是你可以以一种万无一失的方式做的事情。 一种可能性是检查文件中的每个字符,以确保它不包含0x00 - 0x1f0x7f -0x9f范围内的任何字符,但正如我所说,这可能适用于任何数量的文件,包括至lessISO8859的另一个变种。

另一种可能性是在所有支持的语言中查找文件中的特定单词,并查看是否可以find它们。

因此,例如,在8859-1的所有支持的语言中查找等同于英语“and”,“but”,“to”,“of”等,看看它们中是否有大量的事件文件。

我不是在谈论直译,比如:

 English French ------- ------ of de, du and et the le, la, les 

尽pipe这是可能的。 我在谈论目标语言中的常见词汇(据我所知,冰岛人没有“和”的字眼 – 你可能不得不用他们的话来说“鱼”[对不起,这是一个有点刻板印象,我没有意味着任何罪行,只是说明一点])。

我知道你对一个更一般的答案感兴趣,但是ASCII中的好处通常在其他编码中是好的。 这是一个Python单线程来确定标准input是ASCII。 (我很确定这是在Python 2中工作,但我只在Python 3上testing过。)

 python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt 

在Cygwin中,这看起来像是适用于我的:

 find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done 

例:

 find -type f -name "*.txt" | while read file; do (file -i "$file"); done 

你可以通过pipe道来awk,并创build一个iconv命令,从iconv支持的任何源代码将所有内容转换为utf8。

例:

 find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash 

用Perl,使用Encode :: Detect。