我需要找到放在一个目录中的所有文件的编码。有没有办法找到所使用的编码?
file命令不能做到这一点。
我感兴趣的编码是ISO 8859-1。如果是其他编码,我想将文件移动到另一个目录。
我需要找到放在一个目录中的所有文件的编码。有没有办法找到所使用的编码?
file命令不能做到这一点。
我感兴趣的编码是ISO 8859-1。如果是其他编码,我想将文件移动到另一个目录。
当前回答
您可以使用file命令提取单个文件的编码。我有一个sample.html文件:
$ file sample.html
HTML: HTML文档,UTF-8 Unicode文本,有很长的行
$ file -b sample.html
HTML文档,UTF-8 Unicode文本,有很长的行
$ file -bi sample.html
短信/ html;charset = utf-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
utf - 8
其他回答
听起来你在找恩卡。它可以猜测甚至在编码之间进行转换。看看手册页就知道了。
否则,使用file -i (Linux)或file -i (OS X)。这将输出文件的mime类型信息,其中还将包括字符集编码。我也找到了它的手册页:)
在Debian中你也可以使用:encguess:
$ encguess test.txt
test.txt US-ASCII
由于它是一个perl脚本,它可以安装在大多数系统上,通过安装perl或脚本作为独立的,如果perl已经安装。
$ dpkg -S /usr/bin/encguess
perl: /usr/bin/encguess
真的很难确定它是否是ISO 8859-1。如果你有一个只有7位字符的文本,也可能是ISO 8859-1,但你不知道。如果你有8位字符,那么上区域字符也存在于顺序编码中。因此,你必须使用字典来更好地猜测它是哪个单词,并从中确定它必须是哪个字母。最后,如果您检测到它可能是UTF-8,那么您可以确定它不是ISO 8859-1。
编码是最难做的事情之一,因为你永远不知道是否没有任何东西告诉你。
在Perl中,使用Encode::Detect。
在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
您可以将其输送到AWK,并创建一个iconv命令,将所有内容从iconv支持的任何源编码转换为UTF-8。
例子:
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